Skip to content

Read Number in Chinese

题目链接:1082 Read Number in Chinese (25 point(s))

题干大意

以中文的习惯读出数字。

思路

参考了《算法笔记》这本书。

由于中文中,有亿、万,在万中又有千、百、十,故每四个一组处理。其中需要特别注意的是空格的输出,先输出空格在输出字符串比较好。

AC代码

C++
#include <iostream>
#include <vector>
using namespace std;

const char nums[10][5] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
const char wei[5][5]   = {"Shi", "Bai", "Qian", "Wan", "Yi"};
int        main()
{
    int n;
    cin >> n;
    string ans  = to_string(n);
    int    left = 0, right = ans.length();
    if (n < 0) {
        cout << "Fu";
        ++left;
    }
    // 我的规范:一组的下标范围为 [left, right)
    while (right - left > 4)
        right -= 4;
    while (left < ans.length()) {
        bool flag  = false;    // 表示一组中是否含有0
        bool group = false;    // 表示该组是否有数
        while (left < right) { // 处理每一组
            if (left > 0 && ans[left] == '0')
                flag = true;
            else {
                if (flag) { // 一组中存在0, 输出0即处理完毕
                    cout << " ling";
                    flag = false;
                }
                if (n > 0 && left != 0 '' n < 0)
                    cout << " ";
                cout << nums[ans[left] - '0'];
                group = true; // 表示该组有数
                if (left != right - 1) {
                    cout << " " << wei[right - left - 2];
                }
            }
            ++left;
        }
        if (group && right != ans.length()) {
            cout << " " << wei[(ans.length() - right) / 4 + 2];
        }
        right += 4;
    }
    return 0;
}