这个题目让我想起来小学经常做阿拉伯数字和汉字大写的转换,当时有时候会碰到有的地方会吧数字三位一个整体放在一起,例如11,245,856;但是其实这是玩过人习惯的写法,因为人家用thousand,million,billion。但是汉语读数字其实是4位一起的,比如样例里面的其实就是
-1(亿)2345(万)6789,所以搞明白这个,题目思路就出来了。
因为数字不超过9个,所以longlong肯定够了,然后会发现“万”和“亿”之间的数字,与最后四位读法是一样的,因此可以写个Print函数,然后调用两次就可以了(若果有万位的话);
其次就是关于ling和空格的输出问题了。
tips:题目要求的输出空格,但是调试的时候建议把空格全部换成 -,看的比较清晰。
提供几个易出错的数据:
//0
//100
//1010
//1001
//1101
//100010
//100000001
#include <stdio.h>
const int Y = 1e8,W = 10000,Q = 1000,B = 100,Sh = 10; //各个位的基数
char s[][10] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};//汉语拼音
void Print(int n) //输出一个不超过四位的数n∈[1,9999]
{
int qian = n/1000; //取出千位
if(qian)printf("%s Qian",s[qian]);//千位到这结束
n %= 1000;
int bai = n/100; //取出百位
if(bai){
if(qian)printf(" "); //如果有千位输出空格
printf("%s Bai",s[bai]); //百位到这结束
}
else if(qian && n) printf(" ling");//如果百位为0,但是有千位,并且后面还有低位,输出ling
n %= 100;
int shi = n/10; //取出十位
if(shi){
if(qian||bai)printf(" "); //如果十位前面有更高位,输出空格
printf("%s Shi",s[shi]); //十位到这里结束
}
else if(bai && n%10)printf(" ling");//十位为0,但是百位不为0,并且后面还有个位,但是这里不要判断千位,否则类似1001会输出两个ling
n %= 10;
if(n){
if(qian||bai||shi)printf(" "); //如果个位前面有高位,输出空格
printf("%s",s[n]);
}
}
int main()
{
long long n;
scanf("%lld",&n);
if(n==0)printf("ling");
else{
if(n<0){
printf("Fu ");
n = -n; //n小于零取正
}
int yi = n/Y; //有几个亿
n %= Y;
if(yi)printf("%s Yi",s[yi]);//亿到这结束
if(yi && n)printf(" "); //如果亿后面还有非零数字
int wan = n/W; //有几个万
n %= W;
if(yi && wan>0 && wan<=999 )printf("ling ");//有亿,但是后面不足一千万 输出ling
if(wan>0){
Print(wan);
printf(" Wan"); //万到这结束
}
if(wan && n<=999)printf(" ling");//最后四位不足一千
if(yi && wan==0 && n)printf("ling");//如果万为0,但是亿不为0 ,且最后四位还有数字
if(n){
if(yi||wan)printf(" ");
Print(n);
}
}
return 0;
}