一 一十一 一百一十一 一千一百一十一 一万一千一百一十一 一十一万一千一百一十一 一百一十一万一千一百一十一 一千一百一十一万一千一百一十一
可以发现每一千是一个单位。所以我们可以把多数分成多个一千去单独处理。中间再额外添加一个万即可。
所以就可以将问题转换成如何处理一个一万以内的数字的阿拉伯表示形式 分情况讨论可以发现。 1000 一千 1100 一千一百 1010 一千零一十 这也可以分成三个部分 高位 +零+低位 其中零和低位要么同时出现[1010]要么不出现[1100] 所以我们只需要先依次把高位遍历知道走到零就停 再将当前位置继续往后遍历,如果遇到非零则说明存在低位,否则没有低位。 存在低位就加一个”零“,再重复类似高位的操作作为低位。 不存在就直接结束。
代码:
#include <iostream>
#include <string>
using namespace std;
string bits[] = { "","十","百","千" };
string numberstr[] = { "","一","二","三","四","五","六","七","八","九" };
inline string GetNumber(const string number)
{
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;
}
|