题意:



方法一:
模拟


思路:
        首先,通过添加前缀0的方式将字符串长度凑成3的倍数;
        然后,循环遍历字符串,以3个为一组,进行计算;
        最后,输出答案。



#include <bits/stdc++.h>

using namespace std;
string a[]={"billion","million","thousand"};
string b[]={"","one","two","three","four","five","six","seven","eight","nine"};//个位
string c[]={"ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen",
            "nineteen"};
string d[]={"","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};
string s;

void f(int i){
    int flag=0;//标志位,判断是否加and
    if(s[i]>='1'){//百位
        flag=1;
        cout << b[s[i]-'0'] << " hundred ";
    }
    if(s[i+1]=='1'){//十分位
        if(flag)
            cout << "and ",flag=0;
        cout << c[s[i+2]-'0'] << " ";
        return;
    }else if(s[i+1]>='2'){
        if(flag)
            cout << "and ",flag=0;
        cout << d[s[i+1]-'0'] << " ";
    }
    
    if(s[i+2]>'0'){//个位
        if(flag)
            cout << "and ",flag=0;
        cout << b[s[i+2]-'0'] << " ";
    }
}
int main(){
   
    while(cin >> s){
        int len=s.size();//字符串长度
        int num=0;
        if(len%3)
            num=3-len%3;
        len+=num;
        while(num--){//加前缀0,将字符串长度凑成3的倍数
            s='0'+s;
        }
        int i=0;
        if(len>9){//十亿
            f(i);
            cout << "billion ";
            i+=3;
        }
        if(len>6){//百万
            f(i);
            cout << "million ";
            i+=3;
        }
        if(len>3){//千
            f(i);
            cout << "thousand ";
            i+=3;
        }
        f(i);
        cout << endl;
    }
    return 0;
}

时间复杂度:
空间复杂度:

方法二:
递归

思路:
      从输入数字的个位开始,从右到左每三个为一组。
      递归实现。
      最后后序遍历输出。
      

#include <bits/stdc++.h>

using namespace std;
string a[]={"","thousand","million","billion"};
string b[]={"","one","two","three","four","five","six","seven","eight","nine"};//个位
string c[]={"ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen",
            "nineteen"};
string d[]={"","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};

void f(int x,int y){//递归
    if(x==0)
        return;
    f(x/1000,y+1);
    //后序遍历
    int flag=0;
    int u=x/100%10,v=x/10%10,w=x%10;//百分位、十分位、个位
    if(u){//百分位
        flag=1;
        cout << b[u] << " hundred ";
    }
    if(v==1){//十分位
        if(flag)
            cout << "and ",flag=0;
        cout << c[w] << " ";
        cout << a[y] << " ";
        return;
    }else if(v>1){
        if(flag)
            cout << "and ",flag=0;
        cout << d[v] << " ";
    }
    if(w){//个位
        if(flag)
            cout << "and ",flag=0;
        cout << b[w] << " ";
    }
    cout << a[y] << " ";//输出单位
}
int main(){
   int x;
    while(cin >> x){
        f(x,0);//递归
        cout << endl;
    }
    return 0;
}

时间复杂度:
空间复杂度: