题目描述:
将非负整数 num 转换为其对应的英文表示。
示例 1:
输入:num = 123
输出:“One Hundred Twenty Three”
示例 2:
输入:num = 12345
输出:“Twelve Thousand Three Hundred Forty Five”
示例 3:
输入:num = 1234567
输出:“One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven”
示例 4:
输入:num = 1234567891
输出:“One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One”
提示:
0 <= num <= 231 - 1
方法1:
主要思路:
(1)将数字的分解分成几种类型;
(2)数字小于20,则都有直接对应的字符串;
(3)数字在10到100之间,都要使用对应的十位对应的字符串作为辅助字符串进行表示;
(4)数字以三位数字位为一组,进行划分,需要对应的字符串进行辅助表示;
(5)总的使用递归,将数字三个一组的进行划分(注意每个if判断下是直接使用return返回来终止函数);
class Solution {
public:
//递归
string helper(int num,vector<string>&num1,vector<string>&num2,vector<string>&num3){
//数字为0,返回空字符串
if(num==0){
return "";
}
//数字小于20,则直接使用对应的数字作为索引,返回数组中的对应字符串
if(num<20){
return " "+num1[num];
}
//数字在20到100,需要找到对应的十位作为辅助的字符串进行表示,并把剩余的部分接着划分
if(num<100){
return " "+num2[num/10]+helper(num%10,num1,num2,num3);
}
//数字大于99小于1000,既为三位数字时,需要将其百位表示出来,并将剩余部分进行划分
if(num<1000){
return " "+num1[num/100]+" "+num3[0]+helper(num%100,num1,num2,num3);
}
//对于更多的位数的数字,需要每次找到最高的可能分成的三位一组的数字,将该组数字和后面的位数进行分割,并在中间加上对应的修饰字符串即可;
for(int i=1;i<=3;++i){
if(num<pow(1000,i+1)){//每次找到最高的一组三位数字,进行分割,并直接返回
return helper(num/(int)pow(1000,i),num1,num2,num3)+" "+num3[i]+helper(num%(int)pow(1000,i),num1,num2,num3);
}
}
return "";
}
string numberToWords(int num) {
//三种类型的字符串表示
vector<string>num1 = {"","One","Two","Three","Four","Five","Six","Seven","Eight","Nine",
"Ten","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen",
"Eighteen", "Nineteen","Twenty"};
vector<string>num2 = {"","","Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"};
vector<string>num3 = {"Hundred","Thousand","Million","Billion"};
//处理特殊的情形
if(num==0){
return "Zero";
}
//递归求解
string res=helper(num,num1,num2,num3);
//避免首个空格的影响
return res.substr(1);
}
};