万和亿两个单位都是只出现一次的,所以可以分解为每四位读一次,然后在间隔处加上万和亿。
读四位的注意点:
1.如果有高位存在,开头的零要读,否则不读。
2.中间的多个零只读一次。
3.结尾的零不读
4.全零的话返回“”,即不读。
超过四位的情况:
1.小于8位,补0到8位,先读高四位(存在高位标志位为0),加“Wan”,再读低位(存在高位标志位为1)。
2.大于8为,即9位。补0到12位,先读包含亿的最高四位(存在高位标志位为0),加"Yi",再读包含万的四位和最低四位,存在高位标志都为1,中间加“Wan”。
输入为0
此时结果字符串为空,进行特殊处理。
# include <iostream>
#include<string>
using namespace std;
const string num[] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
const string m_exp[] = {"Qian" ,"Bai" ,"Shi", ""};
string read4(string s, bool over4) {
string rv;
bool isfirst = true;
int r = 3, L = 0;
while (r >= 0 && s[r] == '0') --r;
if (r < 0) return "";
while (L <= r && s[L] == '0') ++L;
if (L != 0 && over4) rv = num[0] + " ";
for (int i = L; i <= r; ++i) {
if(s[i]!='0') rv += num[s[i] - '0'] + " " + m_exp[i] + " ";
if (s[i] == '0' && isfirst) {
rv += num[0] + " ";
isfirst = false;
}
}
while (*(rv.end() - 1) == ' ') rv.erase(rv.end() - 1);
return rv;
}
int main()
{
string s, ans;
cin >> s;
if (s[0] == '-') {
ans += "Fu ";
s = s.substr(1, s.size() - 1);
}
if (s.size() > 8) {
s = string(3, '0') + s;
if (read4(s.substr(0, 4), false) != "") ans += read4(s.substr(0, 4), false) + " Yi ";
if (read4(s.substr(4, 4), true) != "") ans += read4(s.substr(4, 4), true) + " Wan ";
ans += read4(s.substr(8, 4), true);
}
else if (s.size() > 4) {
s = string(8 - s.size(), '0') + s;
if (read4(s.substr(0, 4), false) != "") ans += read4(s.substr(0, 4), false) + " Wan ";
ans += read4(s.substr(4, 4), true);
}
else {
s = string(4 - s.size(), '0') + s;
ans += read4(s.substr(0, 4), false);
}
if (!ans.size()) ans += num[0];
while (*(ans.end() - 1) == ' ') ans.erase(ans.end() - 1);
cout << ans;
return 0;
}