用C++实现“学英语”

这道题不难,就是很烦,需要注意的细节很多,思路和注释很详细的,各位看官慢用

思路:
1.接收数据
2.三位,三位分开,不够3的倍数,前方补0
3.进行三位数的英文输出
4.正确添加权重
5.控制好输出格式

#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.push_back("");

    //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)
{
    //两个rets不一样,不要搞混了
    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 num;
    //获取当前输入整数
    while(cin>>num)
    {
        //非法数字输出error
        if(num>999999999 || num<0)
        {
            cout<<"error"<<endl;
            continue;
        }
        int num1=num;
        //每三位存放一次(从后往前)
        vector<int> factor;
        while(num1)
        {
            int n = num1%1000;
            factor.push_back(n);
            num1/=1000;
        }
        //逆制当前的数组
        reverse(factor.begin(), factor.end());
        //确定当前有几个三位数,为输出权重做准备
        int sz=factor.size();
        int heavy=sz-1;
        for(int i=0;i<sz;i++)
        {
            int flag=factor[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
                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)<<" ";
            if(h==0 && t==0&&o!=0)     //1
                cout<<ret_str(o)<<" ";
            if(h!=0 && t==0 && o!=0)   //101
                cout<<ret_str(o)<<" ";
            //long a=pow(1000,heavy);
            //int flag = num%a;
            if(heavy>0 && flag)//输出权重(当前三位数不为0时才能输出权重)
            {
                cout<<heavy_str(heavy)<<" ";
            }
            //每输出一次三位数,权重--;!!!
            heavy--;
        }
        cout<<endl;
    }


}