小凡的老师给了小凡一个任务就是做一个中文的计算器。比如说输入“十加十”,那么小凡就要得到 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;
}