题解 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"!