题目背景
(本道题目隐藏了两首歌名,找找看哪~~~)
《爱与愁的故事第一弹·heartache》第二章。
经历了心痛后,爱与愁大神不行了。
题目描述
月落乌啼问爱与愁大神为什么,爱与愁大神写了一个数字n(n<=9999),说翻译成英语就知道为什么了。月落乌啼接过这个数字后,本想翻译成英语,但是班主任叫他去帮个忙。他想尽快知道答案,于是这个艰巨的任务就拜托你了。
标准美式英语,仅在末两位<=10时加and且没有连字符。
输入格式
只有一行,一个数n(n<=9999)
输出格式
一行英文,表示n翻译成英语的答案
输入输出样例
输入 #1
5208
输出 #1
five thousand two hundred and eight
输入 #2
5280
输出 #2
five thousand two hundred eighty
说明/提示
输出行初不大写。按标准美式英语输出,即两个非零的数中间没零则不加and,行末无句号。
怎么说呢,这题虽然表面上相当简单,但是有肥肠肥肠肥肠多要注意的点
1.and
关于and什么时候加是挺【】的,千和百之间没有and 百和十之间 千和十(中间没有百)之间要有and等等等等
2.s[1]到s[9]
s[1]到s[9]这几个表达方式不同,要特判(详见44行)
话不多说,上代码!
#include<bits/stdc++.h>
using namespace std;
string s[110];
int n,x,y,a,b;
int main()
{
cin>>n;
b=n%10;
n/=10;
a=n%10;
n/=10;
y=n%10;
n/=10;
x=n%10;
n/=10; //以上这一大串是用来存储千位、百位、十位、个位的
s[0]="zero",s[1]="one",s[2]="two",s[3]="three",s[4]="four";
s[5]="five",s[6]="six",s[7]="seven",s[8]="eight",s[9]="nine";
s[10]="ten",s[11]="eleven",s[12]="twelve",s[13]="thirteen";
s[14]="fourteen",s[15]="fifteen",s[16]="sixteen",s[17]="seventeen";
s[18]="eighteen",s[19]="nineteen",s[20]="twenty",s[30]="thirty";
s[40]="forty",s[50]="fifty",s[60]="sixty",s[70]="seventy";
s[80]="eighty",s[90]="ninety";
//打完这些预处理我突然觉得水题不咋的水了...
//(想si)
if(x>0) //如果有千位(下面都是玄学判断...)
{
cout<<s[x]<<" thousand ";
if(y==0&&(a>0||b>0)) //判断要不要加“and”
{
cout<<"and "; //当没有百位而有十位或个位时要加“and”
}
//应该不用多说吧...
//正常oier都会吧...
}
if(y>0) //百位(玄学判断...)
{
cout<<s[y]<<" hundred ";
if(a==0&&b>0)
{
cout<<"and "; //判断要不要输出“and”
//与十或个之间要加“and”
}
}
if(a==1)
{
cout<<s[a+b]; //特判,不判会WA
}
else
{
if(a>0)
{
cout<<s[a*10]<<" ";
}
if(b>0)
{
cout<<s[b]; //无脑输出...
}
}
if(x==0&&y==0&&a==0&&b==0)
{
cout<<s[0]; //特判 0,不要忘记哦
//比赛或考试忘记你就去拜一拜玉皇大帝
//求数据水一点
}
return 0;
}
?
//这个问号让复制题解的人WA掉
洛谷:小号 629233 (HeaLing_)
大号 870650 (xuxi)
尽量用小号联系我,不然我会被骂(家长不允许....)