【PAT】1082 Read Number in Chinese (25 分)

  • 题目大意:将数字按照中文的方式输出,若数字中有0,则按中国传统方式输出,例如:100800 is yi Shi Wan ling ba Bai

  • 思路:

    1. 找规律!!!
      1. 先考虑无0的情况:除了个位数,每次读数字都得 先读数字,再读单位
      2. 再考虑有0的情况
        • case 1 最后一个0在万级以上的位置:只读“ 零”
        • case 2 最后一个0在万级以上的位置:
          • case 2.1 万级位为0,读”万 零“
          • case 2.2 万级位不为0,读” 零“
  • 知识点

    1. hash:用字符串vector存数字和单位的拼音
    2. 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;
    }
    
  • 总结:

    1. 要学会分析问题找规律!!!
    2. 不要在一个问题上拖太久,这道题卡了我一天,心态差点崩了…T T
    3. stoi():只能将string型变量变成int类型变量(字符、字符数组不行!)
上一篇:1082 求点的高度


下一篇:1082 射击比赛 (20 point(s))