有这样一个很简单的问题,给你一个阿拉伯数字,把它读出来。
看到这个问题觉得用dfs可以比较优美的解决,就写了一下,先对数字进行划分,然后再递归解决问题,但是有一些细节问题需要考虑,多个零只读一个,末尾是零则不读,十位是1要读“十”还是“一十”。
#include <iostream>
#include <algorithm>
using namespace std;
string getDigit(int n, int r, bool isHighest)
{
static string d[] = {
"零", "一", "二", "三", "四", "五", "六", "七", "八", "九",
};
if (n == 1) {
if (r != 1)
return d[1];
else if (isHighest)
return "十";
else
return "一十";
} else {
return d[n];
}
}
string getWeight(int n, int r)
{
static string w[] = {
"", "十", "百", "千",
};
if (r == 1) {
if (n != 1)
return w[1];
else
return "";
} else {
return w[r];
}
}
string doConvert(const string& num, int r = 0, bool isLastZero = true)
{
if (r == num.size()) return "";
string ret;
int digit = num[r] - '0';
bool isHighest = (r == num.size() - 1);
if (digit == 0) {
ret = doConvert(num, r + 1, true);
if (!isLastZero)
ret += getDigit(0, r, isHighest);
} else {
ret = doConvert(num, r + 1, false) + getDigit(digit, r, isHighest) + getWeight(digit, r);
}
return ret;
}
string process(const string& num)
{
string ret;
if (num.size() >= 9) {
ret = process(string(num, 8)) + "亿" + process(string(num, 0, 8));
} else if (num.size() >= 5) {
ret = process(string(num, 4)) + "万" + process(string(num, 0, 4));
} else if (num.size() != 0){
ret = doConvert(num);
}
return ret;
}
string convert(string& num)
{
if (num == "0") return "零";
for (int i = 0; i < num.size() / 2; i ++) {
swap(num[i], num[num.size() - i - 1]);
}
return process(num);
}
int main()
{
string n;
while (cin >> n) {
cout << convert(n) << endl;
}
}