1. 程式人生 > >A1082 Read Number in Chinese

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; }