PTA (Advanced Level)1082.Read Number in Chinese

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要怎么控制输出想了很久都没有答案,看了《算法笔记上机训练实战指南》后恍然大悟,代码基本是书上的代码
  • 可以借鉴的地方:
    • 分段的巧妙之处,每次r -= 4定位到第一段随后只要r+4就到另一段了,比我本来用的%, /分割字符串好多了
    • 800000008的输出应该是ba Yi ling ba而不是ba Yi Wan ling ba,也就是中间的段如果全为0就不能输出多余的万
代码
#include
using namespace std;
char number[15][6] = {"ling", "yi", "er", "san", "si",
                 "wu", "liu", "qi", "ba", "jiu"};
char q[5][5] = {"Shi", "Bai", "Qian", "Wan", "Yi"};


int main()
{
    string s;
    cin >> s;
    int l = 0, r = s.size() - 1;
    if(s[0] == '-')
    {
        cout << "Fu";
        l++;
    } //负数输出"Fu",l定位到第一个位
    while(l + 4 <= r)   r -= 4;         //数字分成a,b,c三段,先定位到最高的一段
    while(l < s.size())
    {
        bool acum0 = false;     //累加0
        bool printed = false;   //是否有输出过
        while(l <= r)
        {
            if(l > 0 && s[l] == '0')    acum0 = true;   
            else
            { //当前位不为0
                if(acum0)    //存在累计的0
                {
                    cout << " ling";
                    acum0 = false;
                }
                if(l > 0)   cout << " ";    //非首位的话后面都要输出空格
                cout << number[s[l] - '0'];    //输出对应数字
                printed = true;    // >=1的数字被输出
                if(l != r)  //因为r始终在每一段的最后一位,如果不相等说明不是各位,那么就要输出对应的百十千
                    cout << " " << q[r - l - 1];
            }
            l++;    //处理完当前位,进行下一位
        }
        if(printed && r != s.size() - 1)   //非个位就输出万或亿
            cout << " " << q[(s.size() - 1 - r) / 4 + 2];
        r += 4;
    }

    return 0;
}

引用

https://pintia.cn/problem-sets/994805342720868352/problems/994805385053978624

你可能感兴趣的:(PTA (Advanced Level)1082.Read Number in Chinese)