版权声明:本文为博主原创文章,转载请注明出处,谢谢。 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;
}