题解 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;
}
希望采纳。