题目的难点主要在 零 的添加,这里用st1和st2表示一个需要在此位之前添加零的充要条件:
1. 此位不为零
2. (万内)前面的位数至少有一个零
3. (万内或万外)之前的数不全都是零
#include<iostream>
#include<unordered_map>
using namespace std;
unordered_map<int,string> Hash{{0,"ling"},{1,"yi"},{2,"er"},{3,"san"},{4,"si"},{5,"wu"},{6,"liu"},{7,"qi"},{8,"ba"},{9,"jiu"}};
string ans;
int n;
string get(int a,bool before)
{
string res;
int qian,bai,shi,ge;
qian = a/1000;
bai = a%1000/100;
shi = a%100/10;
ge = a%10;
bool st1 = false,st2 = before;
if(qian)
{
res += Hash[qian] + " Qian ";
st2 = true;
}
else st1 = true;
if(bai)
{
if(st1 && st2) res += "ling ";
res += Hash[bai] + " Bai ";
st2 = true;
st1 = false;
}
else st1 = true;
if(shi)
{
if(st1 && st2) res += "ling ";
res += Hash[shi] + " Shi ";
st1 = false;
}
else st1 = true;
if(ge)
{
if(st1 && st2) res += "ling ";
res += Hash[ge] + " ";
}
return res;
}
int main()
{
cin >> n;
if(n < 0)
{
ans += "Fu ";
n = -n;
}
bool flag = false;
if(!n) ans += "ling ";
if(n / 100000000)
{
ans += get(n/100000000,flag) + "Yi ";
n %= 100000000;
flag = true;
}
if(n / 10000)
{
ans += get(n/10000,flag) + "Wan ";
n %= 10000;
flag = true;
}
if(n)
{
ans += get(n,flag);
}
ans.pop_back();
cout << ans;
}