A1082 Read Number in Chinese

这个题目让我想起来小学经常做阿拉伯数字和汉字大写的转换,当时有时候会碰到有的地方会吧数字三位一个整体放在一起,例如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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43108373/article/details/84308067