English Int:将整数转换为英文表示。
用英文表示数字时,每3
位作为一部分,然后分别补上Billion
、Million
和Thousand
,所以问题可以转化为对包含3
个数字的整数进行转换。
3
位数字则先转换百位,然后判断剩余的两位数是否有特殊的英文表示,没有则依次转换十位和个位,其中要特别注意对0
的处理,反正多提交几次就知道哪里错了。
class Solution {
public:
string numberToWords(int num) {
if(num == 0) return vsSpec[0];
if(num < 0){
ret.append(strNeg);
num = -num;
}
convertPerThousand(num, 0);
ret.pop_back();
return ret;
}
void convertPerThousand(int num, const int big)
{
if(num >= 1000){
convertPerThousand(num / 1000, big + 1);
num %= 1000;
}
if(num != 0){
convertDigit(num);
ret.append(vsThousands[big]);
}
}
void convertDigit(int num)
{
if(num >= 100){
convertHundred(num / 100);
num %= 100;
}
if(num >= 20){
convertTen(num / 10);
num %= 10;
}
if(num != 0){
ret.append(vsSpec[num]);
}
}
void convertHundred(int num)
{
ret.append(vsSpec[num]);
ret.append(strHrd);
}
void convertTen(int num)
{
ret.append(vsTens[num]);
}
private:
string ret;
const vector<string> vsSpec = {
"Zero", "One ", "Two ", "Three ", "Four ",
"Five ", "Six ", "Seven ", "Eight ", "Nine ",
"Ten ", "Eleven ", "Twelve ", "Thirteen ", "Fourteen ",
"Fifteen ", "Sixteen ", "Seventeen ", "Eighteen ", "Nineteen "
};
const vector<string> vsTens = {
"", "", "Twenty ", "Thirty ", "Forty ",
"Fifty ", "Sixty ", "Seventy ", "Eighty ", "Ninety "
};
const vector<string> vsThousands = {
"", "Thousand ", "Million ", "Billion "
};
const string strHrd = "Hundred ";
const string strNeg = "Negative ";
};