PAT乙級_1002 寫出這個數
阿新 • • 發佈:2021-08-16
題目(20分)
讀入一個正整數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。
輸入格式:
每個測試輸入包含 1 個測試用例,即給出自然數n的值。這裡保證n小於10100。
輸出格式:
在一行內輸出n的各位數字之和的每一位,拼音數字間有 1 空格,但一行中最後一個拼音數字後沒有空格。
輸入樣例:
1234567890987654321123456789
輸出樣例:
yi san wu
提交
19分
#include <bits/stdc++.h> using namespace std; int Plus(string n) { int num = 0; int len = n.length(); for (int i = 0; i < len; i++) { char temp = n[i]; num += temp - '0'; //隱式轉換,char型別變int型別,從ASCII碼錶可以看出減去字元0對應的‘48’就是十進位制 } return num; } int reverse(int x) { int _x = 0; while (x != 0) { _x = _x * 10 + x % 10; x /= 10; }return _x; } void Word(int m) { while (1){ int temp = m % 10; switch(temp) { case 0: cout << "lin"; break; case 1: cout << "yi"; break; case 2: cout << "er"; break; case 3: cout << "san"; break; case 4: cout << "si"; break; case 5: cout << "wu"; break; case 6: cout << "liu"; break; case 7: cout << "qi"; break; case 8: cout << "ba"; break; case 9: cout << "jiu"; break; } m /= 10; if (m != 0) cout << " "; else return; } } int main () { string n; cin >> n; //輸入字串 int r = Plus(n); //計算數字的和 int r1 = reverse(r); //翻轉和 Word(r1);//取餘的模式輸出拼音 }
思路:超出了long long,所以以字串的形式cin,再統計數的和;用取餘的方式輸出拼音,所以先反轉一下和。
這裡有個誤區,如果和是0結尾,反轉和的時候0就不存在了(比如300→3)
就少了一分
解決(20分):
都用陣列存放,0就不會消失了。
#include <bits/stdc++.h> using namespace std; int main() { char x[10000]; //字元陣列 最後一個是 '\0' int s[10000]; //字元陣列轉換成int 陣列 int y[10000]; //反轉和 陣列 int g = 0; //統計 反轉和 陣列的長度 int sum = 0;//統計和 cin >> x; //統計字串的和 遇到\0就停止累加 for (int i = 0; x[i] != '\0'; i++) { s[i] = x[i] - '0'; sum += s[i]; } if (sum == 0) cout << "ling"; else //反轉和,放進陣列內 { while (sum != 0) { int k; k = sum % 10; y[g++] = k; sum = sum / 10; } } //從陣列最後往前輸出 解決最後一個拼音不帶空格的問題 for (int i = g - 1; i >= 0; i--) { switch (y[i]) { case 0:if (i != 0)cout << "ling" << " "; else cout << "ling"; break; case 1:if (i != 0)cout << "yi" << " "; else cout << "yi"; break; case 2:if (i != 0)cout << "er" << " "; else cout << "er"; break; case 3:if (i != 0)cout << "san" << " "; else cout << "san"; break; case 4:if (i != 0)cout << "si" << " "; else cout << "si"; break; case 5:if (i != 0)cout << "wu" << " "; else cout << "wu"; break; case 6:if (i != 0)cout << "liu" << " "; else cout << "liu"; break; case 7:if (i != 0) cout << "qi" << " "; else cout << "qi"; break; case 8:if (i != 0)cout << "ba" << " "; else cout << "ba"; break; case 9:if (i != 0)cout << "jiu" << " "; else cout << "jiu"; break; } } return 0; }