题解 P1617 【爱与愁的一千个伤心的理由】
发布于 2020-11-21
这道题的题目梗概就是:输入一个1~4位的数字,输出它的英文。
我们不妨分类一下:
1位:直接输出
十几或几十直接输出
2位:
否则输出几十+一位
几百直接输出
3位:
否则输出几百+两位
几千直接输出
4位:
否则输出几千+3位
另外,只要两个位数间有0,且0的两边不为0,输出“and”
注意:记得特判0的英文zero!!!
所以,可以一个个位数循环。献上代码:
#include<bits/stdc++.h>
using namespace std;
char a[6];
int l;
int main()
{
cin>>a;
l=strlen(a);
for(int i=0;i<l;i++)
{
if(i!=l-2)
{
if(a[i]=='0'&&a[i+1]=='0') continue;//如果本身与后一个都为0,直接跳过
if(a[i]=='0'&&i!=l-1&&a[i+1]!='0') //如果本身是0而下一位不是0才能输出!
{
cout<<"and ";
continue;
}
if(a[i]=='1') cout<<"one ";//打表,输出
if(a[i]=='2') cout<<"two ";
if(a[i]=='3') cout<<"three ";
if(a[i]=='4') cout<<"four ";
if(a[i]=='5') cout<<"five ";
if(a[i]=='6') cout<<"six ";
if(a[i]=='7') cout<<"seven ";
if(a[i]=='8') cout<<"eight ";
if(a[i]=='9') cout<<"nine ";
}//这里判断位数
if(l==4&&i==0) cout<<"thousand ";
if(l==3&&i==0||l==4&&i==1) cout<<"hundred ";
if(l==2&&i==0||l==3&&i==1||l==4&&i==2)
{
if(a[i]=='0'&&a[i+1]=='0') continue;
if(a[i]=='0'&&a[i+1]!='0')
{
cout<<"and ";
continue;
}
if(a[i]=='1')
{
if(a[i+1]=='0')
{
cout<<"and ";
continue;
}//暴力枚举十位(最麻烦的)
if(a[i+1]=='1') cout<<"eleven ";
if(a[i+1]=='2') cout<<"twelve ";
if(a[i+1]=='3') cout<<"thirteen ";
if(a[i+1]=='4') cout<<"fourteen ";
if(a[i+1]=='5') cout<<"fifteen ";
if(a[i+1]=='6') cout<<"sixteen ";
if(a[i+1]=='7') cout<<"seventeen ";
if(a[i+1]=='8') cout<<"eighteen ";
if(a[i+1]=='9') cout<<"nineteen ";
break;
}
if(a[i]=='2') cout<<"twenty ";
if(a[i]=='3') cout<<"thirty ";
if(a[i]=='4') cout<<"forty ";
if(a[i]=='5') cout<<"firty ";
if(a[i]=='6') cout<<"sixty ";
if(a[i]=='7') cout<<"seventy ";
if(a[i]=='8') cout<<"eighty ";
if(a[i]=='9') cout<<"ninety ";
}
}
if(strcmp(a,"0")==0) cout<<"zero";//千万不要忘记特判!
return 0;
}
最后补充一句:if(strcmp(a,"0")==0) cout<<"zero";
也可以写成if(a[0]=='0'&&strlen(a)==1) cout<<"zero";
但由于是char,所以千万不能直接a=="0"!