A1082 Read Number in Chinese
阿新 • • 發佈:2018-12-02
這個題目讓我想起來小學經常做阿拉伯數字和漢字大寫的轉換,當時有時候會碰到有的地方會吧數字三位一個整體放在一起,例如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;
}