Inglish-Number Translator (宇姐的英语小本)

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;
        }

    }
}

也可以多组输入

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值