解题思路 分治法
整体上:
把三个数看成一个整体,读出相应的数的读法
细节上:
1. 把所有的可能出现的字符先用字符数组准备好,注意不要重复,分类要明确,尽量与下标对应起来
2. 100的特殊性,只能在出现>=100时立刻加上去,不能在读完过后加上去
3. 处理过后的数字因为前面是在每个数的后面都加上了” “,可能会存在多余的情况,需要删除掉” ”
4. 对于位数的判断,应当从高到低枚举这个位数上最小的数,如千位,至少就要>= 1000
C++代码
class Solution {
public:
string bit[20] = {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine",
"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen",
"Eighteen", "Nineteen"};
string decade[10] = {"", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};// 没有ten
string big[4] = {"Billion", "Million", "Thousand", ""};// 没有Hundred
string get_part(int num) {// 把这三位数读出来
string res;
if (num >= 100) {
res += bit[num / 100] + " Hundred ";
num %= 100;
}
if (num >= 20) {
res += decade[num / 10] + ' ';
num %= 10;
}
if (num > 0) {
res += bit[num] + ' ';
}
return res;
}
string numberToWords(int num) {
if (!num) return "Zero";
string res;
for (int i = 1000000000, j = 0; i > 0; i /= 1000, ++j) { //i是这个位的最小数,三位三位的看
if (num >= i) {
res += get_part(num / i) + big[j] + ' ';
num %= i;
}
}
while (res.back() == ' ') res.pop_back();// 可能会有多个' ' 都要删除掉
return res;
}
};