1082 Read Number in Chinese (25 分)
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.当我们在读123456789时,将1作为一组,读1“亿”,将2345作为一组,读两千三百四十五“万”,将6789作为一组,读六千七百八十九。显然,我们读数字(不超过10000亿)的时候是从低位到高位,每4位作为一组,读出这些数,再加上单位,如“万”和“亿”。
2.如果我们有一个函数,可以使用拼音读出(0,9999]的数字,那么只需要将数字从低到高,以4位为单位读出,然后再加上相应的权重,如“万”。
3.每四位为一节,节与节之间可能需要读0,或者某一节全为0,这些情况需要特殊处理。
4.在代码中,节内需要读零的情况和节与节之间需要读零的处理方法是一样的。
代码:
#include <cstdio>
/**只有我和上帝知道这些代码在做什么,1/12/2019
***不要改变代码行数,两处注释和行数有关
*/
//py是拼音(ping yin)的缩写
char *py[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
void daYinPinYin(int n)//打印拼音,将一个[0, 9999]的数字用汉字拼音读出
{
if(n == 0)
return;
int qian = n / 1000;//千位数字
if(qian != 0)
printf("%s Qian", py[qian]);
if(n % 1000 == 0)//是1000的整倍数,数字已经读完
return;
//执行到这里,百位,十位和个位不全为0
//需要把剩下的数字读出来
n = n % 1000;//去掉千位的数字
int bai = n / 100;//百位数字
if(qian != 0)//千位不为0
{
if(bai == 0)//百位为0
printf(" ling ");//此时需要读ling,27行条件为假
else
printf(" ");//百位不为0,27行的条件为真
}
if(bai != 0)
printf("%s Bai", py[bai]);
if(n % 100 == 0)
return;//是100的整数倍,即十位和百位都是0
//执行到这里,说明十位和个位不全为0
//需要把剩下的数字读出来
n = n % 100;//去掉百位数字
int shi = n / 10;//十位数字
if(bai != 0)//百位不为0
{
if(shi == 0)//十位为0,43行条件为假
printf(" ling ");
else
printf(" ");//十位不为0,43行条件为真
}
if(shi != 0)
printf("%s Shi", py[shi]);
if(n % 10 == 0)
return;//是10的整数倍,即个位为0,数字已经读完
//执行到这里,个位不为0,需要把个位读出来
if(shi != 0)
printf(" ");
printf("%s", py[n % 10]);//读出个位
}
int main()
{
int n;
scanf("%d", &n);
if(n == 0)
{
printf("ling");
return 0;
}
if(n < 0)
{
printf("Fu ");
n = -n;
}
int yi = n / 100000000;//亿位数字
if(yi != 0)
printf("%s Yi", py[yi]);
n = n % 100000000;//去掉亿位数字
int wan = n / 10000;//wan表示需要读多少万
int qianwan = wan / 1000;//千万位的数字
if(yi != 0)//亿位不为零
{
if(qianwan == 0)
printf(" ling ");
else
printf(" ");
}
if(wan != 0)
{
daYinPinYin(wan);
printf(" Wan");
}
n = n % 10000;//只留下第4位数字
int qian = n / 1000;//千位数字
if(wan != 0)
{
if(qian == 0)
printf(" ling ");
else
printf(" ");
}
if(n != 0)
daYinPinYin(n);
}
可以使用下面的10进制整型数实例进行测试daYinPinYin函数,包含了所有可能的情况:
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111