一、思路
使用整型num读入,若num<0输出"Fu “并转换为正数,若num为0,输出"ling”。
将num转换为字符串,并i = 0开始遍历,j = 串长 - 1开始递减,记录该位是第几位
1、构造三个字符串数组:
digit[10][5] = { “ling”, “yi”, “er”, “san”, “si”, “wu”, “liu”, “qi”, “ba”, “jiu” };
place1[3][5] = { “”, " Wan", " Yi" };
place2[4][6] = { “”, " Shi", " Bai", " Qian" };
2、非零数字的输出
即输出数组:digit[ str[i] ],然后输出该位后缀:place2[ j % 4 ];
3、零的输出
观察ling的输出规律:若当数字非0,且其左侧(直接前驱)是零(一或多个),则要输出"ling"
因此,若遍历中遇到0,则zero = 1。则之后若遇到某位是非零数字,且zero = 1,便先输出一个"ling", 并使zero = 0。
4、亿、万的输出
若j是4的倍数,则要输出亿或万,但有条件:若这四位没输出过非零数字,则不能输出。
例如:9 0000 8000读为九万零八千,万的四位没有输出。
则遇到非零数字,使tag = 1。当j%4 == 0,且tag == 1时,输出亿或万,并恢复tag == 0.
注意:测试点3答案错误:输入0时仅输出0;
二、代码
#include <cstdio>
#include <cstring>
int main()
{
char digit[10][5] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" }, place1[3][5] = { "", " Wan", " Yi" }, place2[4][6] = { "", " Shi", " Bai", " Qian" }, str[10];
int num;
scanf("%d", &num);
if( num <= 0 )
{
printf("%s", num < 0 ? "Fu ":"ling");
num *= -1;
}
sprintf(str, "%d", num);
for( int i = 0, zero = 0, tag = 0, j = strlen(str) - 1; i < strlen(str); ++i, --j )
{
if( str[i] == '0' )
zero = 1;
else
{
printf("%s%s%s%s", i ? " ":"", zero ? "ling ":"", digit[ str[i] - '0' ], place2[j % 4]);
tag = 1;
zero = 0;
}
if( j % 4 == 0 && tag )
{
printf("%s", place1[ j / 4 ]);
tag = 0;
}
}
}