- 参考了网友的解题思路。 
 - 模块化思想。 
 - 关键是怎么找到想要位得数据, 怎么找到下一位得数据。 
 - 3位3位添加,最后倒着度。heavy那个变量为size-1。 且索引从1开始。 
 - 方便对其得思路要用。 
 - 先处理百分位,在处理有10位的后两位,如果没有十位,那就要单独处理个位。(和百位搭配) 
 
 #include<bits/stdc++.h>
using namespace std;
//模块化思维
//这个函数是为了添加会出现得所有英文字符
string ret_str(int i){
    vector<string> rets;
    //为了好对齐,所以添加了空
    rets.push_back("");
    //1-10
    rets.push_back("one");//rets[1]
    rets.push_back("two");
    rets.push_back("three");
    rets.push_back("four");
    rets.push_back("five");
    rets.push_back("six");
    rets.push_back("seven");
    rets.push_back("eight");
    rets.push_back("nine");
    rets.push_back("ten");//rets[10]
     //11~19
    rets.push_back("eleven");//rets[11]
    rets.push_back("twelve");
    rets.push_back("thirteen");
    rets.push_back("fourteen");
    rets.push_back("fifteen");
    rets.push_back("sixteen");
    rets.push_back("seventeen");
    rets.push_back("eighteen");
    rets.push_back("nineteen");//rets[19]
    rets.push_back("");//空  rets[20]
    rets.push_back("");// rets[21] 意味着10
    //10已经在前面定义过了,若十位为2~9的数字在此输出下标为20+i,为十位的数字
    rets.push_back("twenty");//rets[22]
    rets.push_back("thirty");
    rets.push_back("forty");
    rets.push_back("fifty");
    rets.push_back("sixty");
    rets.push_back("seventy");
    rets.push_back("eighty");
    rets.push_back("ninety");//rets[29]
    return rets[i];
}
//这个函数是为了补单位
string heavy_str(int i){
    vector<string> rets;
    rets.push_back("");//意思一样,方便对齐
    rets.push_back("thousand");//rets[1]
    rets.push_back("million"); //rets[2]
    rets.push_back("billion"); //rets[3]
    return rets[i];
}
int main(){
    long n;
    while(cin>>n){
        if(n>999999999||n<=0){
            cout<<"error"<<endl;
        }
        vector<int> factor;
        //每三位存放一次(从后往前)
        while(n){
            int num  = n % 1000;
            factor.push_back(num);
            n /=1000;
        }
        //逆制当前的数组(我们最后输出的时候要逆的输出)
        reverse(factor.begin(),factor.end());
        //确定当前有几个三位数,为输出权重做准备
        int sz = factor.size();
        int heavy = sz-1;
        //开始处理
        for(int i = 0; i< sz; i++){
            int h = factor[i]/100;//得到百位数
            //如果取十位数
            factor[i]%=100;
            int t = factor[i]/10;//得到十位数
            int o = factor[i]%10;//得到个位数
            //先处理百位
            if(h!=0 && (t!=0||o!=0)){//111 or 101 
                cout<<ret_str(h)<<" "<<"hundred"<<" "<<"and"<<" ";
            }
            if(h!=0 && t==0&&o==0){//100
                cout<<ret_str(h)<<" "<<"hundred"<<" ";
            }
            //处理十位
            if(t!=0&&t>1&&o!=0){//21
                cout<<ret_str(t+20)<<" "<<ret_str(o)<<" ";
            }
            if(t!=0&&t>1&&o==0){//20
                cout<<ret_str(t+20)<<" ";
            }
            if(t!=0&&t<2){//19
                cout<<ret_str(10*t+o)<<" ";
            }
            //处理个位(没有10位)(此种情况下个位如果为0.直接不管就行)
            if(t==0&&o!=0){// 1 or 101
                cout<<ret_str(o)<<" ";
            }
            if(heavy>0){
                 cout<<heavy_str(heavy)<<" ";
            }
            //每输出一次三位数,权重--;!!!
            heavy--;
        }
        cout<<endl;
    }
    return 0;
}