Skip to content

Latest commit

 

History

History
98 lines (85 loc) · 3.39 KB

1082. Read Number in Chinese.md

File metadata and controls

98 lines (85 loc) · 3.39 KB

【PAT A-1082】Read Number in Chinese

题意概述

给定一个不超过 9 位的整数,用中文的方式给出它的读音。如果负数,则先输出 Fu。例如,-123456789 读为Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu。注意:零(ling)必须按照中国传统读音的方式进行处理。例如,100800 读为yi Shi Wan ling ba Bai

输入输出格式

输入给出一个不超过 9 位的整数。

用中文的方式给出数字的读音。

算法设计

为了方便处理,我们可以用一个字符串 ans 存储所有的读音,每个读音后面都跟一个空格字符,最后再删除末尾多余的空格字符。

如果给出的数字是负数,先向 ans 中添加一个Fu ,并把-从数字中删除。如果数字有 9 位,先将亿位数字读音添加到 ans 中,并将其从数字中删除。这样剩余的数字最多有 8 位。4 位一组分别处理,可以编写一个函数专门处理这种不超过 4 位数字的读音,并视情况添加读音Wan ling 。处理过程略嫌麻烦,建议尽可能多地使用 string 提供的成员函数,这可以简化我们的代码。具体实现可参考下面的代码。

测试数据

为了方便你检测自己的程序,下面给出一些测试数据,仅供参考。

输入:-123456789
输出:Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
输入:100800
输出:yi Shi Wan ling ba Bai
输入:0
输出:ling
输入:5
输出:wu
输入:500000000
输出:wu Yi
输入:50005000
输出:wu Qian Wan wu Qian
输入:500000005
输出:wu Yi ling wu
输入:500001234
输出:wu Yi ling yi Qian er Bai san Shi si
输入:505050505
输出:wu Yi ling wu Bai ling wu Wan ling wu Bai ling wu
输入:550505050
输出:wu Yi wu Qian ling wu Shi Wan wu Qian ling wu Shi

C++代码

#include <bits/stdc++.h>
using namespace std;
using gg = long long;
vector<string> digit{"ling", "yi",  "er", "san", "si",
                     "wu",   "liu", "qi", "ba",  "jiu"};
vector<string> carry{"Qian", "Bai", "Shi"};
string f(const string& s) {
    string ans;
    //不断查找非0数字的位置
    for (gg i = s.find_first_not_of('0'), last = 0; i != -1;
         last = i + 1, i = s.find_first_not_of('0', last)) {
        if (i > last) {  //和上一个非0数字之间有0,输出一次ling
            ans += digit[0] + " ";
        }
        ans += digit[s[i] - '0'] + " ";  //输出数字
        if (4 + i - s.size() < 3) {  //输出进位
            ans += carry[4 + i - s.size()] + " ";
        }
    }
    return ans;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    string si, ans;
    cin >> si;
    if (si[0] == '-') {  //输出负号
        ans += "Fu ";
        si.erase(si.begin());
    }
    if (si.size() == 9) {  //输出亿位
        ans += digit[si[0] - '0'] + " Yi ";
        si.erase(si.begin());
    }
    if (si.size() <= 4) {
        ans += f(si);
    } else {
        string t1 = f(si.substr(0, si.size() - 4)),
               t2 = f(si.substr(si.size() - 4));
        if (not t1.empty()) {
            ans += t1 + "Wan " + t2;
        } else if (not t2.empty()) {
            ans += (t2.find("ling") != 0 ? digit[0] + " " + t2 : t2);
        }
    }
    ans.erase(ans.find_last_not_of(' ') + 1, ans.size());  //删除末尾的空格
    cout << (ans.empty() ? digit[0] : ans) << "\n";
    return 0;
}