- 由于最多只有九位数字,事先输入好九个单位,和十个数字的拼音;
- 先实现没有零的版本,在此基础上进行改造,使其能够处理如
100800
这样的数字; - 正负号单独处理,提取出来后删除负号。
#include<iostream>
#include<string>
using namespace std;
string nums[] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
string units[] = { "", "Shi", "Bai", "Qian", "Wan", "Shi", "Bai", "Qian", "Yi" };
bool shouldPrintNumber(int cur, string s) {
if (s[cur] != '0')
return true;
//从个位起,以四个数字为一组,检查cur所在组剩下的数字,如果存在非零数字,说明当前的零要输出
int remain = (s.size() - cur - 1) % 4;
while (remain-- > 0) {
if (s[++cur] != '0') {
return true;
}
}
return false;
}
//在res尾部添加拼音前判断是否应该先在res末尾加空格,主要是为了避免重复输出空格符
bool shouldAddSpace(string res) {
//如果res前面有非空格的字符,则应该在当前加空格
return !res.empty() && res[res.size() - 1] != ' ';
}
int main() {
string s, res;
cin >> s;
//单独处理负号
if (s[0] == '-') {
s.erase(0, 1);
res += "Fu ";
}
if (s.size() == 1 && s[0] == '0') {
cout << "ling" << endl;
return 0;
}
int cur = 0;
while (cur < s.size()) {
string num = nums[s[cur] - '0'], unit = units[s.size() - cur - 1];
if (shouldPrintNumber(cur, s)) {
if (shouldAddSpace(res)) {
res.append(" ");
}
res += num;
}
//如果当前位置的单位有名字,并且当前数字不是零(防止出现零千、零百等情况),或者当前单位是万或亿,因为万、亿是必须输出的
if (unit != "" && (num != "ling" || unit == "Wan" || unit == "Yi")) {
if (shouldAddSpace(res)) {
res.append(" ");
}
res += unit;
}
++cur;
}
cout << res << endl;
}