洛谷 P1617 爱与愁的一千个伤心的理由
题目
题目背景
(本道题目隐藏了两首歌名,找找看哪~~~)
《爱与愁的故事第一弹·heartache》第二章。
经历了心痛后,爱与愁大神不行了。
题目描述
月落乌啼问爱与愁大神为什么,爱与愁大神写了一个数字n(n<=9999),说翻译成英语就知道为什么了。月落乌啼接过这个数字后,本想翻译成英语,但是班主任叫他去帮个忙。他想尽快知道答案,于是这个艰巨的任务就拜托你了。
标准美式英语,仅在末两位<=10时加and且没有连字符。
输入输出格式
输入格式:
只有一行,一个数n(n<=9999)
输出格式:
一行英文,表示n翻译成英语的答案
输入输出样例
输入样例#1:
①
5208
②
5280
③
5000
输出样例#1:
①
five thousand two hundred and eight
②
five thousand two hundred eighty
③
five thousand
说明
输出行初不大写。按标准美式英语输出,即两个非零的数中间没零则不加and,行末无句号。
题解
由高位向低位模拟,注意一些特判就行了
代码
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int n,x,y,z;
string s[20],ss[10];
int main(){
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";ss[2]="twenty";ss[3]="thirty";
ss[4]="forty";ss[5]="fifty";ss[6]="sixty";
ss[7]="seventy";ss[8]="eighty";ss[9]="ninety";
scanf("%d",&n);
if (n==0) {
cout<<"zero";
return 0;
}
if (n>=1000){
cout<<s[n/1000]<<" thousand ";
n=n%1000;
x=1;
}
if (n>=100){
cout<<s[n/100]<<" hundred ";
n=n%100;
y=1;
}
if (n>=10){
if (x==1&&y==0) cout<<("and ");
if (n<20) {
cout<<s[n];
return 0;
}
cout<<ss[n/10]<<" ";
n=n%10;
z=1;
}
if (n!=0){
if ((x==1||y==1)&&z==0) cout<<("and ");
cout<<s[n];
}
return 0;
}