-
题目大意:将数字按照中文的方式输出,若数字中有0,则按中国传统方式输出,例如:100800 is yi Shi Wan ling ba Bai
-
思路:
- 找规律!!!
- 先考虑无0的情况:除了个位数,每次读数字都得 先读数字,再读单位
- 再考虑有0的情况:
- case 1 最后一个0在万级以上的位置:只读“ 零”
- case 2 最后一个0在万级以上的位置:
- case 2.1 万级位为0,读”万 零“
- case 2.2 万级位不为0,读” 零“
- 找规律!!!
-
知识点
- hash:用字符串vector存数字和单位的拼音
- stoi():只能将string型变量变成int类型变量(字符、字符数组不行!)
-
代码:
#include <iostream> #include <string> #include <vector> using namespace std; int main(){ string n; vector<string> a = {"yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"}; vector<string> b = {"", "Shi", "Bai", "Qian", "Wan", "Shi", "Bai", "Qian", "Yi"}; // 从低到高。b[0]是个位数 cin >> n; if(stoi(n) == 0) // 一定要考虑n == 0的情况! printf("ling"); if(n[0] == '-') // 有负号的情况 printf("Fu"); for(int i = 0; i < n.length(); i++){ if(n[i] == '-') continue; // 上面输出了负号,所以跳过 if(n[i] == '0') continue; // 是0就跳过 else{ if(i > 0 && n[i - 1] == '0'){ // 分析前面有0的情况:case 1 最后一个0在万级以上的位置; case 2 最后一个0在万级及万级以下的位置 if(n.length() - i + 1 > 5) // case 1 printf(" ling"); else if(n.length() - i + 1 <= 5){ // case 2 if(n[n.length() - 5] == '0') // case 2.1 若万级位置为0 printf(" Wan ling"); else // case 2.2 若万级位置不为0 printf(" ling"); } } if(i != 0) printf(" "); if(i == n.length() - 1) // 个位数没有单位,所以只要输出数值 printf("%s", a[n[i] - '0' - 1].c_str()); else printf("%s %s", a[n[i] - '0' - 1].c_str(), b[n.length() - i - 1].c_str()); // 无0的情况:输出这个数字的数值和单位 } } return 0; }
-
总结:
- 要学会分析问题、找规律!!!
- 不要在一个问题上拖太久,这道题卡了我一天,心态差点崩了…T T
- stoi():只能将string型变量变成int类型变量(字符、字符数组不行!)
相关文章
- 12-271082 Read Number in Chinese (25分)
- 12-27【PAT】1082 Read Number in Chinese (25 分)
- 12-271082 Read Number in Chinese (25 分)
- 12-27PAT甲级 1082 Read Number in Chinese 把阿拉伯数字翻译成中文
- 12-271082 Read Number in Chinese
- 12-27【PAT甲级】1117 Eddington Number (25分)
- 12-27PAT 甲级 1024 Palindromic Number (25 分)(大数加法,考虑这个数一开始是不是回文串)
- 12-27PAT A1024 Palindromic Number (25 分)——回文,大整数
- 12-27PAT1082:Read Number in Chinese
- 12-27PAT A1117 Eddington Number (25 分)——数学题