[编程题]学英语

版权声明:本文为博主原创文章,转载请注明出处,谢谢。 https://blog.csdn.net/qq846294282/article/details/77864841

[编程题]学英语

时间限制:1秒 空间限制:32768K

Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文:
如22:twenty two,123:one hundred and twenty three。

说明:
数字为正整数,长度不超过九位,不考虑小数,转化结果为英文小写;
输出格式为twenty two;
非法数据请返回“error”;
关键字提示:and,billion,million,thousand,hundred。

方法原型:public static String parse(long num)

输入描述:

输入一个long型整数

输出描述:

输出相应的英文写法
示例1
输入

2356
输出

two thousand three hundred and fifty six

解题思路

将该long型整数看作一个字符串,3位为1组进行拆分。9位最多分3组,分别添加million、thousand、空后缀,然后即可拼接出9位数的英文形式。
需要注意的是1个组可能只有1位或2位

#include <iostream>
#include <string>
using namespace std;

string trans(string c, int t){
    if(t == 1){// 个位和百位处理
        if(c == "0"){
            return "";
        }else if(c == "1"){
            return "one";
        }else if(c == "2"){
            return "two";
        }else if(c == "3"){
            return "three";
        }else if(c == "4"){
            return "four";
        }else if(c == "5"){
            return "five";
        }else if(c == "6"){
            return "six";
        }else if(c == "7"){
            return "seven";
        }else if(c == "8"){
            return "eight";
        }else if(c == "9"){
            return "nine";
        }
    }else if(t == 10){// 十位处理
        if(c == "0"){
            return "";
        }else if(c == "2"){
            return "twenty";
        }else if(c == "3"){
            return "thirty";
        }else if(c == "4"){
            return "forty";
        }else if(c == "5"){
            return "fifty";
        }else if(c == "6"){
            return "sixty";
        }else if(c == "7"){
            return "seventy";
        }else if(c == "8"){
            return "eighty";
        }else if(c == "9"){
            return "ninety";
        }
    }
    return "";
}

string transTeen(string c){// 十位数为1的情况
    if(c == "0"){
        return "ten";
    }else if(c == "1"){
        return "eleven";
    }else if(c == "2"){
        return "twelve";
    }else if(c == "3"){
        return "thirteen";
    }else if(c == "4"){
        return "fourteen";
    }else if(c == "5"){
        return "fifteen";
    }else if(c == "6"){
        return "sixteen";
    }else if(c == "7"){
        return "seventeen";
    }else if(c == "8"){
        return "eighteen";
    }else if(c == "9"){
        return "nineteen";
    }
    return "";
}

// 三位为一组 ,将原数拆分成不同的组进行分析
string parse3(string n){
    if(n.length() == 3){
        if(n.substr(1, 1) != "1"){
            if(n.substr(0, 1) == "0"){// 此处未加更多判断,只限AC
                return trans(n.substr(1, 1), 10) + " " + trans(n.substr(2, 1), 1);
            }
            if(n.substr(1, 1) == "0" && n.substr(2, 1) == "0"){
                return trans(n.substr(0, 1), 1) + " hundred";
            }else if(n.substr(1, 1) == "0" && n.substr(2, 1) != "0"){
                return trans(n.substr(0, 1), 1) + " hundred and " + trans(n.substr(2, 1), 1);
            }else if(n.substr(1, 1) != "0" && n.substr(2, 1) == "0"){
                return trans(n.substr(0, 1), 1) + " hundred and " + trans(n.substr(1, 1), 10);
            }else{
                return trans(n.substr(0, 1), 1) + " hundred and " + trans(n.substr(1, 1), 10) + " " + trans(n.substr(2, 1), 1);
            }
        }else{
            return trans(n.substr(0, 1), 1) + " hundred and " + transTeen(n.substr(2, 1));
        }
    }else if(n.length() == 2){
        if(n.substr(0, 1) != "1"){
            if(n.substr(1, 1) == "0"){
                return trans(n.substr(0, 1), 10);
            }else{
                return trans(n.substr(0, 1), 10) + " " + trans(n.substr(1, 1), 1);
            }
        }else{
            return transTeen(n.substr(1, 1));
        }
    }else{
        return trans(n, 1);
    }
}

int main()
{
    string n;
    while(cin>>n){
        bool flag = true;
        for(unsigned i = 0; i < n.size(); ++i){// 非法输入检测
            if(n[i] < '0' || n[i] > '9'){
                flag = false;
            }
        }

        string str = "error";
        if(flag){
            switch(n.length()){
                case 9:
                    str = parse3(n.substr(0, 3)) + " million " + parse3(n.substr(3, 3)) + " thousand " + parse3(n.substr(6, 3));
                    break;
                case 8:
                    str = parse3(n.substr(0, 2)) + " million " + parse3(n.substr(2, 3)) + " thousand " + parse3(n.substr(5, 3));
                    break;
                case 7:
                    str = parse3(n.substr(0, 1)) + " million " + parse3(n.substr(1, 3)) + " thousand " + parse3(n.substr(4, 3));
                    break;
                case 6:
                    str = parse3(n.substr(0, 3)) + " thousand " + parse3(n.substr(3, 3));
                    break;
                case 5:
                    str = parse3(n.substr(0, 2)) + " thousand " + parse3(n.substr(2, 3));
                    break;
                case 4:
                    str = parse3(n.substr(0, 1)) + " thousand " + parse3(n.substr(1, 3));
                    break;
                case 3:
                    str = parse3(n.substr(0, 3));
                    break;
                case 2:
                    str = parse3(n.substr(0, 2));
                    break;
                case 1:
                    str = parse3(n.substr(0, 1));
                    break;
                default:
                    str = "error";// n的位数不为1~9时抛错
            }
        }

        cout<<str<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq846294282/article/details/77864841