给定一个不超过 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
#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;
}