题解 P1617

· · 题解

嗯,看了看下面同学们的的题解,实在是有一些长。

其实不需要用到桶(我个人觉得有些麻烦),所以我就先做了预处理,最后感觉还不错。

整体思路是一位一位去判断,每判断一位就用erase()方法擦掉一位。

以下是预处理部分(头文件就不说了):

string nums[]={"and","one","two","three","four","five","six","seven","eight","nine"};
//这是存储数字的
string words[]={"hundred ","thousand "};
//单词
string ties[]={"and","ten","twenty","thirty","fourty","fifty","sixty","seventy","eighty","ninety"};
//整十数
string twos[]={"ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"};
//11到19

然后做特别处理(个位数,11到19),注释就不需要加了吧...:

if(number.length()==1){
    if(number[0]!='0') cout<<nums[number[0]-'0']<<endl; else cout<<"zero\n";
    return 0;
}else if(number.length()==2 && number[0]=='1'){
    cout<<twos[number[1]-'0']<<endl;
    return 0;
}

继续开始正规处理:

while(number.length()>0){
    flag=true;
    _for(i,0,number.length())
        if(number[i]!='0') flag=0;
    if(flag) break;
    //这一段用来判断后续是不是都为0,如果是的话,那么就中断
    if((number[0]!='0' || number.length()==2) || (number[0]=='0' && number[1]!='0')){
        //先决条件:开头不为0或长度为2,开头为0且第二位不为0
        /*举个例子:
            7002中两个0都会被省略
            8098中的0不会被省略
        */
        if(number.length()!=2) cout<<nums[number[0]-'0']<<" "<<((number.length()>2 && number[0]!='0')?words[number.length()-3]:"");
        //这一句输出数字+单位(若长度大于2)
        else cout<<ties[number[0]-'0']<<" ";
        //否则就输出整十数
    }
    number.erase(0,1);//抹掉第一位数字
}

于是这道题就做完了。

全代码:

#include<iostream>
#include<string>
#include<cstring>
#define _for(i,a,b) for(int i=a;i<b;i++)
using namespace std;
string nums[]={"and","one","two","three","four","five","six","seven","eight","nine"};
string words[]={"hundred ","thousand "};
string ties[]={"and","ten","twenty","thirty","fourty","fifty","sixty","seventy","eighty","ninety"};
string twos[]={"ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"};
string character,number;
bool flag=false;/*是否全为0*/ 
int main(){
    cin>>number;
    if(number.length()==1){
        if(number[0]!='0') cout<<nums[number[0]-'0']<<endl; else cout<<"zero\n";
        return 0;
    }else if(number.length()==2 && number[0]=='1'){
        cout<<twos[number[1]-'0']<<endl;
        return 0;
    }
    while(number.length()>0){
        flag=true;
        _for(i,0,number.length())
            if(number[i]!='0') flag=0;
        if(flag) break;
        if((number[0]!='0' || number.length()==2) || (number[0]=='0' && number[1]!='0')){
            if(number.length()!=2) cout<<nums[number[0]-'0']<<" "<<((number.length()>2 && number[0]!='0')?words[number.length()-3]:"");
            else cout<<ties[number[0]-'0']<<" ";
        }
        number.erase(0,1);
    }
    return 0;
}

希望采纳。