PAT (Advanced Level) Practice 1082 Read Number in Chinese (25 分)(C++)(甲級)
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
//感覺本題可能有很多人會因為自己讀得不正確然後做錯;而且本題邏輯比較難寫
//這裡大概能把以下幾個測試用例通過應該沒啥問題了;當然還要考慮負數
//0 零
//10 一十
//101一百零一
//100001 一十萬零一
//10000000 一千萬
//100000001 一億零一
//101000001 一億零一百萬零一
#include <cstdio>
#include <cstring>
#include <cmath>
int main()
{
int N = 0;
char num[12][10] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu", "\0" };
int S[10] = { 0 };
int top = -1;
scanf("%d", &N);
if (!N) printf("ling");//輸入為0直接列印了
if (N < 0)//輸入為負列印fFu,並取絕對值
{
N = -N;
printf("Fu ");
}
while (N)//把N的各位數字放入棧中
{
S[++top] = N % 10;
N /= 10;
}
int i=0, first = 1, last = 1;
while (top >= 0)//打印出來;這裡一定要小心0️⃣的列印!!!
{
if (!S[top])//出現0️⃣之後繼續向後掃描再決定要不要輸出ling
{
for (i = top; i >= 0 && !S[i] && i != 4; i--);
if ((i+1) % 4 && i!=4) printf(" ling");
if (i < 0) return 0;
top = i;
}
else last = top;//上次非零位置
if (top == 4 && last != 8)
{
if (S[top])
{
if (first) printf("%s Wan", num[S[top]]), first = 0;//控制輸出格式
else printf(" %s Wan", num[S[top]]);
}
else printf(" Wan", num[S[top]]);//注意單位首字母是大寫,而數字的字母都是小寫
}
else if(S[top])
{
if (first) printf("%s", num[S[top]]), first = 0;
else printf(" %s", num[S[top]]);
}
if (top % 4 == 1) printf(" Shi");
if (top % 4 == 2) printf(" Bai");
if (top % 4 == 3) printf(" Qian");
if (top == 8) printf(" Yi");
top--;
}
return 0;
}