LeetCode: 273. Integer to English Words

Convert a non-negative integer to its english words representation. Given input is guaranteed to be less than ​​23^1 - 1​​.

Example 1:

Input: 123
Output: "One Hundred Twenty Three"

Example 2:

Input: 12345
Output: "Twelve Thousand Three Hundred Forty Five"

Example 3:

Input: 1234567
Output: "One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"

Example 4:

Input: 1234567891
Output: "One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One"

解题思路

根据英文读法模拟求解

AC 代码

class Solution {
private:
// 1000 以内
string numberToWordsRef(int num)
{
unordered_map<int,string> numbers
= {{0,"Zero"},{1,"One"},{2,"Two"},{3,"Three"},{4,"Four"},{5,"Five"},{6,"Six"},
{7,"Seven"},{8,"Eight"},{9,"Nine"},{10,"Ten"},{11,"Eleven"},{12,"Twelve"},
{13,"Thirteen"},{14,"Fourteen"},{15,"Fifteen"},{16,"Sixteen"},{17,"Seventeen"},
{18,"Eighteen"},{19,"Nineteen"},{20,"Twenty"},{30,"Thirty"},{40,"Forty"},
{50,"Fifty"},{60,"Sixty"},{70,"Seventy"},{80,"Eighty"},{90,"Ninety"}};
string ans;
if(num / 100 > 0)
{
ans = numbers[num/100] + " Hundred";
}
if(num % 100 > 20)
{
if(ans.empty() == false) ans += " ";

ans += (numbers[(num%100)/10*10]);
if(num % 10 != 0)
{
ans += (" " + numbers[(num%10)]);
}
}
else if(num % 100 != 0)
{
if(ans.empty() == false) ans += " ";
ans += numbers[(num%100)];
}

return ans;
}
public:
string numberToWords(int num) {
string magnitudes[] = {"Thousand", "Million", "Billion", "Trillion", "Trilliard"};
string ans;

if(num == 0) return "Zero";

int cnt = 0;
while(num != 0)
{
int temp = num % 1000;
num /= 1000;

if(cnt == 0)
{
ans = numberToWordsRef(temp);
}
else
{
if(temp != 0)
{
if(ans.empty() == false)
{
ans = " " + ans;
}
ans = numberToWordsRef(temp) + " " + magnitudes[cnt-1] + ans;
}
}

++cnt;
}
return ans;
}
};