1. 程式人生 > >PAT (Advanced Level) Practice 1082 Read Number in Chinese (25 分)(C++)(甲級)

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