273 整数转换英文表示

题目描述:
将非负整数 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);
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值