【基础训练-map】Number Translator

英数转换算法解析
本文介绍了一种将英文数字字符串转换为整数的算法实现,通过使用C++和map数据结构来高效处理从negative到million的数字范围。文章提供了完整的代码示例,并解释了关键步骤。

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

CTU Open 2004,UVA 486

问题链接POJ2121 ZOJ2311 Inglish-Number Translator

问题简述:(略)

问题分析:(略)

程序说明

  这个问题可以用两种方法解决,一是字符串比较,二是使用map。

  程序需要一个单词一个单词(空格隔开)读入处理。读到换行时,一行结束,计算出结果。

  使用函数getchar()读入一个单词后面的字符,如果是行结束符号,则一行结束。

题记:(略)

参考链接:(略)


AC的C++语言程序如下(使用map):

[cpp]  view plain  copy
  1. /* POJ2121 ZOJ2311 Inglish-Number Translator */  
  2.   
  3. #include <iostream>  
  4. #include <stdio.h>  
  5. #include <map>  
  6.   
  7. using namespace std;  
  8.   
  9. int main()  
  10. {  
  11.     string s;  
  12.     int ans, sum, flag, a;  
  13.     char c;  
  14.   
  15.     map<string, int> m;  
  16.     m["negative"] = -1;  
  17.     m["zero"] = 0;  
  18.     m["one"] = 1;  
  19.     m["two"] = 2;  
  20.     m["three"] = 3;  
  21.     m["four"] = 4;  
  22.     m["five"] = 5;  
  23.     m["six"] = 6;  
  24.     m["seven"] = 7;  
  25.     m["eight"] = 8;  
  26.     m["nine"] = 9;  
  27.     m["ten"] = 10;  
  28.     m["eleven"] = 11;  
  29.     m["twelve"] = 12;  
  30.     m["thirteen"] = 13;  
  31.     m["fourteen"] = 14;  
  32.     m["fifteen"] = 15;  
  33.     m["sixteen"] = 16;  
  34.     m["seventeen"] = 17;  
  35.     m["eighteen"] = 18;  
  36.     m["nineteen"] = 19;  
  37.     m["twenty"] = 20;  
  38.     m["thirty"] = 30;  
  39.     m["forty"] = 40;  
  40.     m["fifty"] = 50;  
  41.     m["sixty"] = 60;  
  42.     m["seventy"] = 70;  
  43.     m["eighty"] = 80;  
  44.     m["ninety"] = 90;  
  45.     m["hundred"] = 100;  
  46.     m["thousand"] = 1000;  
  47.     m["million"] = 1000000;  
  48.   
  49.     ans = sum = flag = 0;  
  50.     while(cin >> s) {  
  51.         a = m[s];  
  52.         if(a  == -1)  
  53.             flag = 1;  
  54.         else if(a  == 100)  
  55.             sum *= 100;  
  56.         else if(a  == 1000 || a  == 1000000) {  
  57.             ans += sum * a;  
  58.             sum=0;  
  59.         } else  
  60.             sum += a;  
  61.   
  62.         if((c = getchar()) == '\n') {  
  63.             if(flag==1)  
  64.                 cout << -(ans + sum) << endl;  
  65.             else  
  66.                 cout << ans + sum << endl;  
  67.   
  68.             ans = sum = flag = 0;  
  69.         }  
  70.     }  
  71.   
  72.     return 0;  

  1. }  

学到的点:
要结合题目分析,若是hundred则直接用sum*=100即可,因为后面不会再出现sum*=的情况,而若是thousand和million,则必须用一个ans+=sum*..,然后再把sum清零,因为分析易知若thousand之后还出现hundred,若一直在sum上乘,则会导致位数弄多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值