一
一十一
一百一十一
一千一百一十一
一万一千一百一十一
一十一万一千一百一十一
一百一十一万一千一百一十一
一千一百一十一万一千一百一十一
可以发现每一千是一个单位。所以我们可以把多数分成多个一千去单独处理。中间再额外添加一个万即可。
所以就可以将问题转换成如何处理一个一万以内的数字的阿拉伯表示形式
分情况讨论可以发现。
1000 一千
1100 一千一百
1010 一千零一十
这也可以分成三个部分 高位 +零+低位
其中零和低位要么同时出现[1010]要么不出现[1100]
所以我们只需要先依次把高位遍历知道走到零就停
再将当前位置继续往后遍历,如果遇到非零则说明存在低位,否则没有低位。
存在低位就加一个”零“,再重复类似高位的操作作为低位。
不存在就直接结束。
代码:
#include <iostream>
#include <string>
using namespace std;
string bits[] = { "","十","百","千" };
string numberstr[] = { "","一","二","三","四","五","六","七","八","九" };
///拿到一万以内的数字【不包含一万】返回一个汉语数字
inline string GetNumber(const string number)
{
//分成三段
/*
如:1011 一千零一十一
一千 零 一十一
从最高位 零 低位
但是低位可能为0
如:1100
一千一百
*/
//先处理高位
int j = 0;
string res = "";
int size = number.size();
while (j < size && number[j] != '0')
{
res += numberstr[number[j] - '0'] + bits[size - j - 1];
j++;
}
while (j < size && number[j] == '0')
{
j++;
}
if (j < size)
{
res += "零";
while (j < size && number[j] != '0')
{
res += numberstr[number[j] - '0'] + bits[size - j - 1];
j++;
}
}
return res;
}
inline void Work(const int num)
{
if (num == 0)
{
cout << "零";
}
else
{
if (num >= 10000)
{
cout << GetNumber(to_string(num / 10000));
cout << "万";
cout << GetNumber(to_string(num % 10000));
}
else {
cout << GetNumber(to_string(num % 10000));
}
}
puts("");
}
int main() {
int num = 10000000;
while (num >=0)
{
Work(num);
num--;
}
return 0;
}