Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output Fu
first if it is negative. For example, -123456789 is read as Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
. Note: zero (ling
) must be handled correctly according to the Chinese tradition. For example, 100800 is yi Shi Wan ling ba Bai
.
Input Specification:
Each input file contains one test case, which gives an integer with no more than 9 digits.
Output Specification:
For each test case, print in a line the Chinese way of reading the number. The characters are separated by a space and there must be no extra space at the end of the line.
Sample Input 1:
-123456789
Sample Output 1:
Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
Sample Input 2:
100800
Sample Output 2:
yi Shi Wan ling ba Bai
---------------------------------------这是题目和解题的分割线--------------------------------------
这首先要搞清楚怎么读数字,我一般是从右到左“个十百千万”...这样就导致看到题目很萌比,搜罗了一圈才发现,我平时真是太不善于观察了。1,0000、1,2345,6789 ,这样的逗号分隔有没有很常见!这道题就是要这样处理,四位划分。
比如说1234,5678,从高位开始读,先读局部,输出数字(只要不是局部末尾比如4比如8)再输出位数,所以1234读出来是 yi Qian er Bai san Shi si ,局部读完,(只要不是整体末尾比如8)输出位数,那就变成了 yi Qian er Bai san Shi si Wan 。后面依葫芦画瓢就ok~
但还有一点需要特别处理一下,0应该怎么读?思考至此我再次愣住,平时就那样读啊,这是常识,哪儿来那么多弯弯绕绕= =
还是用个具体的例子来说明吧!100800——yi Shi Wan ling ba Bai。
这里出现了四个零,但只有第二个零是读出来了的。因为其余三个都包括在了位数(Wan、Bai)中。(在参考了别人的代码以后)可以想到(ps:这里找不到链接了不好意思),零的输出如果放在下一次的循环会让事情变得简单很多~ 设置一个标记,if 如果当前数字是0,标志置为1,并不作任何输出。else 加上一个判断,如果标记为1,输出ling。一定要是if和else的非此即彼关系,不然800尾巴上两个零不会被筛出去。更具体的还是看代码吧!
(这么简单的事我居然说了这么多...全网大概又是只有我不懂吧...所以必须写下来,不然以后万一忘了也没人参考)
啊对,还有测试点0和测试点4的数据是负数,不是fu是Fu,大小写一定要注意!!!
#include<cstdio>
#include<cstring>
int main()
{
char str[15];
char num[15][5] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char wei[10][5] = {"Shi","Bai","Qian","Wan","Yi"};
scanf("%s",str);
//i是当前值,j是局部(逗号)位置
int len = strlen(str),i = 0,j = len-1;
//特殊值0的判断
if(len==1&&str[0]=='0')
{
printf("ling");
return 0;
}
//如果是负数,指针往前走一步
if(str[0]=='-')
{
printf("Fu");
i++;
}
//从左往右读,所以j得找到最左边的逗号
while(i<=j-4)
j -= 4;
//零的标记号
bool flag = false;
//没遍历完该数字
while(i<=len-1)
{
//每个局部,零标志都要初始化一下
flag = false;
//局部输出
while(i<=j)
{
//如果当前值是0,留到下一次处理
if(str[i]=='0') flag = true;
//一定要有else,因为当前值为0的话什么都不要动
else
{
//如果上一次是0,这一次还能进循环,说明可输出
if(flag)
{
printf(" ling");
flag = false;
}
//数字前空格的输出,只要不是第一个数字都行
if(i!=0) printf(" ");
printf("%s",num[str[i]-'0']);
//位数前空格一律输出,因为位数前一定有空格
if(i!=j) printf(" %s",wei[j-i-1]);
//j-i-1对应wei数组中位数的名称
//i!=j,因为局部位置的个位数不需要位数输出
}
i++; //记得加1
}
//如果不是数字的末尾,输出位数
if(j!=len-1) printf(" %s",wei[(len-j)/4+2]);
j += 4; //局部位置+4
}
return 0;
}