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
-729
1000101
814022
解题思路:这道题很有趣,英文代表的数字转换成阿拉伯数字,不怕麻烦的话可以使用一大堆if来判读,但是我们不可能使用这么low的方法,其实可以将
英文单词存进数组之中,就先之前做过的键盘题一样将每一个得到的单词和数组中的单词一一比对。另外,我们会发现hundred,thousand,million,这些
单词的存在有着特殊的意义,它们可以看成是一个标志,可以用来和它们之前的数字组成数,最终统计到最后得到的数中。
上代码:
1 #include<stdio.h>
2 #include<string.h>
3 int main()
4 {
5 char a[32][50]= {"zero","one","two","three","four","five","six","seven",
6 "eight","nine","ten","eleven","twelve","thirteen","fourteen",
7 "fifteen","sixteen","seventeen","eighteen","nineteen",
8 "twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety","hundred",
9 "thousand","million","negative"
10 };
11 int len1,k,j,i,flag=1,sum,acc,z;
12 char s[1000],x[110][110];
13 gets(s);
14 len1=strlen(s);
15 k=0,j=0;
16 sum=0;
17 acc=0;
18 for(i=0; i<=len1; i++) ///拆数
19 {
20 if(s[i]!=' '&&s[i]!='\0')
21 {
22 x[j][k++]=s[i];
23 }
24 else if((s[i]==' '&&s[i+1]!= ' ')||(s[i]=='\0'))
25 {
26 x[j][k]='\0';
27 j++;
28 k=0;
29 }
30 }
31 for(z=0; z<j; z++)
32 {
33 for(i=0; i<32; i++)
34 {
35 if(strcmp(x[z],a[i])==0)
36 break;
37 }
38 if(i<=20)
39 {
40 acc=acc+i;
41 }
42 else if(i>20&&i<=27)
43 {
44 acc=acc+(i-18)*10;
45 }
46 else if(i==28)
47 {
48 acc=acc*100;
49 }
50 else if(i==29)
51 {
52 sum=sum+acc*1000;
53 acc=0;
54 }
55 else if(i==30)
56 {
57 sum=sum+acc*1000000;
58 acc=0;
59 }
60 else if(i==31)
61 {
62 flag=-1;
63 }
64 }
65 printf("%d\n",(sum+acc)*flag);
66 return 0;
67 }
来源:oschina
链接:https://my.oschina.net/u/4415286/blog/4004073