Sample Input
six
negative seven hundred twenty nine
one million one hundred one
eight hundred fourteen thousand twenty two
Sample Output
6
-729
1000101
814022
Source
问题链接:POJ2121 ZOJ2311 Inglish-Number Translator
问题简述:(略)
问题分析:(略)
程序说明:
这个问题可以用两种方法解决,一是字符串比较,二是使用map。
程序需要一个单词一个单词(空格隔开)读入处理。读到换行时,一行结束,计算出结果。
使用函数getchar()读入一个单词后面的字符,如果是行结束符号,则一行结束。
题记:(略)
参考链接:(略)
AC的C++语言程序如下(使用map):
-
-
- #include <iostream>
- #include <stdio.h>
- #include <map>
-
- using namespace std;
-
- int main()
- {
- string s;
- int ans, sum, flag, a;
- char c;
-
- map<string, int> m;
- m["negative"] = -1;
- m["zero"] = 0;
- m["one"] = 1;
- m["two"] = 2;
- m["three"] = 3;
- m["four"] = 4;
- m["five"] = 5;
- m["six"] = 6;
- m["seven"] = 7;
- m["eight"] = 8;
- m["nine"] = 9;
- m["ten"] = 10;
- m["eleven"] = 11;
- m["twelve"] = 12;
- m["thirteen"] = 13;
- m["fourteen"] = 14;
- m["fifteen"] = 15;
- m["sixteen"] = 16;
- m["seventeen"] = 17;
- m["eighteen"] = 18;
- m["nineteen"] = 19;
- m["twenty"] = 20;
- m["thirty"] = 30;
- m["forty"] = 40;
- m["fifty"] = 50;
- m["sixty"] = 60;
- m["seventy"] = 70;
- m["eighty"] = 80;
- m["ninety"] = 90;
- m["hundred"] = 100;
- m["thousand"] = 1000;
- m["million"] = 1000000;
-
- ans = sum = flag = 0;
- while(cin >> s) {
- a = m[s];
- if(a == -1)
- flag = 1;
- else if(a == 100)
- sum *= 100;
- else if(a == 1000 || a == 1000000) {
- ans += sum * a;
- sum=0;
- } else
- sum += a;
-
- if((c = getchar()) == '\n') {
- if(flag==1)
- cout << -(ans + sum) << endl;
- else
- cout << ans + sum << endl;
-
- ans = sum = flag = 0;
- }
- }
-
- return 0;
- }
学到的点:
要结合题目分析,若是hundred则直接用sum*=100即可,因为后面不会再出现sum*=的情况,而若是thousand和million,则必须用一个ans+=sum*..,然后再把sum清零,因为分析易知若thousand之后还出现hundred,若一直在sum上乘,则会导致位数弄多了。