回忆我们学习读数的思路,每四位为一组:(个)十百千
每个组都是相互独立的,我们只需要解决组内的读数即可
什么时候需要读“零”呢?我们考虑一个四位组
- 1000:一千
- 1001:一千零一
- 1010:一千零一十
- 1100:一千一百
可以发现,对于一段夹在非零数之间的零,需要读出来
这个概念可以转化成:当遇到一个零后面紧邻一个非零位,那么这个零就需要读出来
我们再来看这种特殊情况:
- 1000010:一百万零一十
- 1010010:一百零一万零一十
可以发现,“零”一十的“零”,来自于“0010”一前面的这个“0”
也就是说,这种情况也符合我们之前总结出的规则:当遇到一个零后面紧邻一个非零位,那么这个零就需要读出来
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<vector>
using namespace std;
string radix[4] = { "","Shi","Bai","Qian" };
string chi[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
vector<string> ans;
int main()
{
int a;
scanf("%d",&a);
if (a < 0) printf("Fu ");
a = abs(a);
if (a == 0) ans.push_back(chi[0]);
int index = 0;
int zero = 0;
while (a != 0) {
//每四位一组
if (index == 4) ans.push_back("Wan");
if (index == 8) ans.push_back("Yi");
//当前位的紧邻低位是否为0
if (index % 4 == 0) zero = 0;
//当前位非零
//当前位为零但紧邻低位非零
if ((a % 10 == 0 && zero != 0) || a % 10 != 0) {
//index % 4 != 0
//空字符串\0会带来输出格式错误
if (index % 4 != 0 && a % 10 != 0)
ans.push_back(radix[index % 4]);
ans.push_back(chi[a % 10]);
zero = a % 10 != 0 ? 1 : 0;
}
index++;
a /= 10;
}
for (int i = ans.size() - 1; i >= 0; --i) {
cout << ans[i];
if (i != 0) printf(" ");
}
return 0;
}