| 小凡的老师给了小凡一个任务就是做一个中文的计算器。比如说输入“十加十”,那么小凡就要得到 20 这个值 |
| ,但是小凡太笨怎么都搞不定,所以老师给他降低了要求,让他只要把阿拉伯数字转换成中文就行了, |
| 还说如果他连这个都不会就不给他及格了。小凡都快哭了,好心的你帮帮他吧。 |
| 输入 |
| 有多组测试数据,请用while(…)读入数据,直到EOF。 |
| 每组数据为一串数字,如:2358、2989、51(不超过9999)。 |
| 输出 |
| 每个输入对应一个输出。对应上面的输出分别为二千三百五十八、两千九百八十九、五十一。 |
| 样例输入 |
| 36 |
| 211 |
| 2126 |
| 10 |
| 20 |
| 101 |
| 样例输出 |
| 三十六 |
| 二百一十一 |
| 二千一百二十六 |
| 十 |
| 二十 |
| 一百零一 |
| 提示 |
| 1、用while(scanf(“%s”,str)!=EOF)或while(gets(str) |
| |
| 2、情况比较繁琐,请多思考 |
| |
| |
| |
| 1.梳理一下如果是人类来识别阿拉伯数字并转化为中文的过程: |
| a.先数出这个数是几位数,以便确定最高位; |
| |
| b.如果数码不是0,则连同他的权一起读出来;如果遇到数码为零的则该为的权就不读出来; |
| |
| (一个零我们直接读个零;如果有多个相邻的零,我们也只读一个零) (这一条规则是本题的处理的关键, |
| 看看能否在这点转化,优化算法) |
| |
| 当flag = 1 且不超过1:不读出它的权(屏蔽掉该位的权);当flag = 2时,屏蔽掉前一个零(考虑写成函数) |
| 迭代上述过程.(最终没有采用该法.) |
| |
| 思想方法,变换角度审视问题(经常是在构成问题的这些素材之间切换视角) |
| 比如100101 |
| 十万位上有非0数,我们就连同它的权读出,下一个非零数为百位,也连同它的权一起读出, |
| 再有个位上的非零数(这时只读出数码) 一十万 一百 一 |
| 再往里头插入一个零,如果有空位的话。(想法挺好,不太好实现.最后还是边调用函数(处理非零) 便插入'零'一个比较长的if) |
| 好在这个题目要求的范围只在9999内,不会引起十万和一十万的分歧(然而11读十一还是一十一) |
| 即便有如此分歧,我们可以单独再开一一个if 输入的如果是两位数且以一开头。判断即可(单独一个:0) |
| */ |
| ```c |
| |
| #include <stdio.h> |
| #include <string.h> |
| #include <math.h> |
| #include <stdlib.h> |
| |
| |
| |
| char * change_to_Chinese_character(char str_i, char*); |
| |
| char* insert_weights(char *buf, int len); |
| |
| int internal_zero(char *str,int i,int len); |
| |
| int main() |
| { |
| |
| char str[5]; |
| char buf[10]; |
| |
| |
| |
| while (scanf("%s", str) != EOF) |
| { |
| |
| |
| |
| int len = strlen(str); |
| |
| |
| |
| |
| |
| |
| |
| char result[10][6] = { 0 }; |
| int cnt_result = 0; |
| if (str[0] != '0') |
| { |
| |
| int k = 0; |
| int j = len; |
| for (int i = 0; i < len; i++) |
| { |
| |
| |
| if (i >= 1 && str[i] == '0' && str[i - 1] != '0' && internal_zero(str, i, len)) |
| { |
| strcpy(result[k++], change_to_Chinese_character(str[i], buf)); |
| cnt_result++; |
| } |
| else if (str[i] != '0') |
| { |
| |
| strcpy(result[k++], change_to_Chinese_character(str[i], buf)); |
| cnt_result++; |
| if (j >= 2) |
| { |
| strcpy(result[k++], insert_weights(buf, j)); |
| cnt_result++; |
| } |
| } |
| |
| j--; |
| } |
| } |
| else |
| { |
| strcpy(result[0],"零") ; |
| cnt_result++; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| for (int i = 0; i < cnt_result; i++) |
| { |
| if (len == 2 && str[0] == '1') |
| printf("%s", result[i + 1]); |
| else |
| printf("%s", result[i]); |
| } |
| printf("\n"); |
| } |
| |
| return 0; |
| } |
| |
| |
| int internal_zero(char *str,int i,int len) |
| { |
| int cnt = 0; |
| for(;i<len;i++) |
| { |
| if(str[i] != '0') |
| { |
| cnt++; |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| return cnt; |
| } |
| |
| |
| |
| |
| char* insert_weights(char *buf, int len) |
| { |
| char weight[5][6] = { "十","百","千", "万" }; |
| strcpy(buf, weight[len - 2]); |
| return buf; |
| |
| } |
| char * change_to_Chinese_character(char str_i, char* buf) |
| { |
| |
| |
| |
| |
| |
| |
| switch (str_i) |
| { |
| |
| case '1': |
| strcpy(buf, "一"); |
| break; |
| case '2': |
| strcpy(buf, "二"); |
| break; |
| case '3': |
| strcpy(buf, "三"); |
| break; |
| case '4': |
| strcpy(buf, "四"); |
| break; |
| case '5': |
| strcpy(buf, "五"); |
| break; |
| case '6': |
| strcpy(buf, "六"); |
| break; |
| case '7': |
| strcpy(buf, "七"); |
| break; |
| case '8': |
| strcpy(buf, "八"); |
| break; |
| case '9': |
| strcpy(buf, "九"); |
| break; |
| |
| case '0': |
| strcpy(buf, "零"); |
| break; |
| |
| default: |
| break; |
| |
| |
| } |
| return buf; |
| |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了