描述:给定一个整数,打印该整数的英文描述。
示例 1:
输入: 123
输出: "One Hundred Twenty Three"
示例 2:
输入: 12345
输出: "Twelve Thousand Three Hundred Forty Five"
示例 3:
输入: 1234567
输出: "One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"
示例 4:
输入: 1234567891
输出: "One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One"
注意:本题与 273 题相同:https://leetcode-cn.com/problems/integer-to-english-words/
思路1:最直观的想法是,模拟。英语表示整数均是三位一分割三位一分割的,既然这样,那么我们可以将个位表示、十几表示、几十表示以及三位千、六位百万、九位十亿均分别使用字符串数组存储起来,并在存储时将字符串表示与下标对应起来,方便后续检索,比如n<10则Digits[n]=n,n<20则Teens[n-10]=n,n<100则Tens[n/10]=n;然后再从高位到低位三位三位遍历,比如先109,再106,最后103,每次先取出高位进行递归表示,并取出低位留着下一次递归表示,最后要去除字符串末尾的空格。递归表示时,依次判断0、<10、<20、<100以及100到999,其中0、<10、<20可以直接索引数组表示,而<100需要先表示十位再递归表示个位,而100到999需要先表示百位再递归表示到<100表示。假设1234567891,计算机会将其分为1/234/567/891,先表示1为One Billion,再从234/567/891中取出234,表示234为100到999,故2/34,即Two Hundred,再取出34,表示34为<100,故3/4,即Thirty,最后表示4为Four,整个234递归后返回Two Hundred Thirty Four Million,以此类推。
//个位 n<10 Digits[n]=n
string Digits[10] = {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};
//十几 n<20 Teens[n-10]=n
string Teens[10] = {"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"};
//几十 n<100 Tens[n/10]=n
string Tens[10] = {"", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};
//千 百万 十亿 3 6 9
string Thousands[10] = {"", "Thousand", "Million", "Billion"};
string numberToWords(int num)
{
if (num == 0)
return "Zero";
string ans;
int unit=1e9;
//三个三个一位 从高位向低位遍历 Thousands[i]依次九位、六位、三位、0位
for(int i=3;i>=0;i--)
{
int curNum=num/unit;
//九位以上 六位以上 三位以上
if(curNum!=0)
{
//取出剩余部分
num-=curNum*unit;
string str;
dfs(str,curNum);
ans+=str+Thousands[i]+" ";
}
//除以三位
unit/=1000;
}
//去掉末尾空格
while(ans.back()==' ')
ans.pop_back();
return ans;
}
void dfs(string& str,int curNum)
{
if(curNum==0)
return;
if(curNum<10)
str+=Digits[curNum]+" ";
else if(curNum<20)
{
int curPos=curNum-10;
str+=Teens[curPos]+" ";
}
else if(curNum<100)
{
int curPos=curNum/10;
curNum-=curPos*10;
str+=Tens[curPos]+" ";
dfs(str,curNum);
}
else
{
int curPos=curNum/100;
curNum-=curPos*100;
str+=Digits[curPos]+" "+"Hundred ";
dfs(str,curNum);
}
}
总结:10的9次方为1e9。注意,其先是三位三位一划分,然后每次使用递归表示当前所划分的内容,递归中又分为个位、十几、几十、几百。理清这两层!!!