Description
宇姐是个爱学习的好孩纸,尤其喜欢英歌历史,但是对于数字的英文单词,他总是傻傻分不清,于是他把一些常用或者典型的单词都按照自己喜欢的方式整理到了自己的小本本上。有天,珲姐发现了这个秘密,想借他的本本学习一下这些单词,却发现看不懂这些单词都表示数字几,你能帮帮他吗?
注意:所表示的数字-999,999,999≤N≤999,999,999。宇姐的本本上可能有:negative,zero,one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen,twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,hundred,thousand,million。
Input
输入一行英文,即宇姐本本上的需要你翻译的部分。 请注意: 1.负数前面有词negative; 2.当能用thousand的时候,将不用hundred。例如:1500将写为“one thousand five hundred”,而不是“fifteen hundred”。
Output
输出单行结果,输出对应的值。
Sample Input
negative seven hundred twenty nine
one million one hundred one
eight hundred fourteen thousand twenty two
Sample Output
-7291000101
814022
题意是:将一串英文字母转化成 罗马数字
negative 代表的是 该数是负数
例如:
样例一:-(7*100+29)=-729;
样例二:1*1000000+1*100+1=1000101
这一个样例说明了 在 million 和 thousand 下边为什么要将 sum 清零
如果不将 sum 清零 直接是 sum+= .. 的话,就变成了 (1*10000000+1)*100+1 结果就不一样了
样例三:(8*100+14)*1000+22=814022
一开始运行错误的原因是:
我用的是 gets 输入一个字符串,一直不出样例,然后改成 cin>>s 就对了 就在这说一下 gets 和 cin 对输入字符串有什么区别
cin不接受空格,TAB,换行符 等键的输入,遇到这些键,字符串会终止
而gets()则接受连续的输入,包括空格,TAB
本题的样例输入是 先输入一个单词,然后看符合哪一个,计算出结果之后,再去输入下一个单词,直到遇见空字符,也就是换行
如果用 gets 输入的话,输入完 negative 之后,不知道你停止了,还在等着你输入,所以就会不出结果
而用 cin 输入的话,输入完 negative和 空格 之后,cin 代表停止了,就会进入while 循环,执行下边的语句
用数组实现
代码如下:
1.第一种方法:
//用一个数组实现,找到对应的英文单词,找出他的序号,用它的序号来间接表示他的罗马数字
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
int i,flag=0,sum=0,d=0;
char s[101];
//char a[][12]={"zero","0","one","1","two","2","three","3","four","4","five","5","six","6","seven","7","eight","8","nine","9","ten","10","eleven","11","twelve","12","thirteen","13","fourteen","14","fifteen","15","sixteen","16","seventeen","17","eighteen","18","nineteen","19","twenty","20","thirty","30","forty","40","fifty","50","sixty","60","seventy","70","eighty","80","ninety","90","hundred","thousand","million","negative"};
chara[][20]={"zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety","hundred","thousand","million"};
while(cin>>s){
if(strcmp(s,"negative")==0)
flag=1;
if(strcmp(s,"million")==0){
sum*=1000000;
d+=sum;
sum=0;
}
if(strcmp(s,"thousand")==0){
sum*=1000;
d+=sum;
sum=0;
}
if(strcmp(s,"hundred")==0)
sum*=100;
else
{
for(i=0;i<28;i++){
if(strcmp(s,a[i])==0){
if(i>=0&&i<=20){
sum+=i;
break;
}
if(i>=21&&i<=27){
sum+=(i-18)*10;
break;
}
}
}
}
if(getchar()=='\n'){
if(flag==1)
printf("-%d",d+sum);
else
printf("%d",d+sum);
break;
}
}
}
2.第二种方法:
//用两个数组实现,一个存 英文单词,一个存 罗马数字,其中序号对应的就是相应的罗马数字
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
int i,flag=0,sum=0,d=0;
char s[101];
//char a[][12]={"zero","0","one","1","two","2","three","3","four","4","five","5","six","6","seven","7","eight","8","nine","9","ten","10","eleven","11","twelve","12","thirteen","13","fourteen","14","fifteen","15","sixteen","16","seventeen","17","eighteen","18","nineteen","19","twenty","20","thirty","30","forty","40","fifty","50","sixty","60","seventy","70","eighty","80","ninety","90","hundred","thousand","million","negative"};
char a[][20]={"zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety","hundred","thousand","million"};
int c[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,30,40,50,60,70,80,90};
while(cin>>s)
{
if(strcmp(s,"negative")==0)
flag=1;
if(strcmp(s,"million")==0){
sum*=1000000;
d+=sum;
sum=0;
}
if(strcmp(s,"thousand")==0){
sum*=1000;
d+=sum;
sum=0;
}
if(strcmp(s,"hundred")==0)
sum*=100;
for(i=0;i<=27;i++)
if(strcmp(s,a[i])==0){
sum+=c[i];
break;
}
if(getchar()=='\n')
{
if(flag==1)
printf("-%d",d+sum);
else
printf("%d",d+sum);
break;
}
}
}
也可以多组输入