首页 > 代码库 > ACM解题之在线翻译 Give Me the Number

ACM解题之在线翻译 Give Me the Number

 

Give Me the Number

Time Limit: 2 Seconds                                     Memory Limit: 65536 KB                            

Numbers in English are written down in the following way (only numbers less than 109 are considered). Number  abc,def,ghi is written as "[abc] million [def] thousand [ghi]". Here "[xyz] " means the written down number xyz .  

In the written down number the part "[abc] million" is omitted  if abc = 0 , "[def] thousand" is omitted if  def = 0 , and "[ghi] " is omitted if ghi = 0 .  If the whole number is equal to 0 it is written down as "zero". Note that words "million" and "thousand" are singular even if the number of millions or thousands respectively is greater than one.

Numbers under one thousand are written down in the following way. The number xyz is written as "[x] hundred and [yz] ”. ( If yz = 0 it should be only “[x] hundred”. Otherwise if y = 0 it should be only “[x] hundred and [z]”.) Here "[x] hundred and" is omitted if x = 0 . Note that "hundred" is also always singular.

Numbers under 20 are written down  as  "zero",  "one",  "two",  "three",  "four",  "five",  "six", "seven",  "eight",  "nine",  "ten",  "eleven",  "twelve",  "thirteen", "fourteen",  "fifteen",  "sixteen",  "seventeen",  "eighteen", and  "nineteen" respectively.  Numbers from 20 to 99 are written down in the following way. Number xy is written as "[x0] [y] ", and numbers divisible by ten are written as  "twenty",  "thirty",  "forty",  "fifty",  "sixty",  "seventy", "eighty", and  "ninety"  respectively.

For example, number 987,654,312 is written down as "nine hundred and eighty seven million six hundred and fifty four thousand three hundred and twelve", number 100,000,037 as "one hundred million thirty seven", number 1,000 as "one thousand". Note that "one" is never omitted for millions, thousands and hundreds.

Give you the written down words of a number, please give out the original number.

Input

Standard input will contain multiple test cases. The first line of the input is a single integer T (1 <= T <= 1900) which is the number of test cases. It will be followed by T consecutive test cases. 

Each test case contains only one line consisting of a sequence of English words representing a number.

Output

For each line of the English words output the corresponding integer in a single line. You can assume that the integer is smaller than 109.

Sample Input

3oneelevenone hundred and two

 

Sample Output

111102

贴上题目的地址:

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2971


先说题目吧,这玩意就是一个在线翻译的东东,就是把英文表示的数字转换成阿拉伯数字。
然后再说解题的思路:
1.数字,比如1,2,3,11,30这种的,肯定没办法通过计算来得到,只能switch case,这些就是最小的基本单位。
2.然后是 32这种由30 + 2 就可以得出
3.下来就是hundred这些有单位的(不是说没有十位个位哈,只是十位个位没有单独的字符串来表示),one hundred就是 1*100
4.上面的数都比较特殊,也是基本单位,然后就是推广了。
  three hundred an twelve 从hundred单位这里分开,整个数的结果就等于 L*单位+R 就是左边的数值乘上单位,然后加上单位右面的数字。
然后对L,R的值,又可以递归的调用这个方法,得出它的值,直到单位小于100的,就直接把数字相加(本质上就是L*1+R)

懂了这个就好办了,直接贴代码吧,个人对代码的要求没写那么精炼,确实有待改进:

  1 import java.util.Scanner;  2 public class Main {  3     public static void main(String[] args) {  4         //String key="nine hundred and eighty seven million six hundred and fifty four thousand three hundred and twelve";  5         Scanner sc = new Scanner(System.in);  6         int T=sc.nextInt();  7         sc.nextLine();  8         while(T>0){  9             String input; 10             input=sc.nextLine(); 11             input.toLowerCase(); 12             String []word = input.split(" "); 13  14             long dan[]=new long[word.length+1]; 15             //获取最大的单位 16             //初始化 17             for (int i = 0; i < word.length; i++) { 18                 String key = word[i]; 19                 switch (key) { 20                 case "hundred": 21                     dan[i]=100; 22                     break; 23                 case "thousand": 24                     dan[i]=1000; 25                     break; 26                 case "million": 27                     dan[i]=1000000; 28                     break; 29                 default: 30                     dan[i]=0; 31                     break; 32                 }//switch 33             }//for 34             long result = getResult(word, dan, 0, word.length); 35             System.out.println(result); 36             T--; 37         } 38     } 39  40     //first 包含,last不包含 41     public static long getResult(String word[],long dan[],int first,int last){ 42         long res=0; 43         long max=1; 44         int maxnum=0; 45  46         //找到单位最大的那个 47         for (int i = first; i < last; i++) { 48             if(dan[i]>max){ 49                 max =dan[i]; 50                 maxnum=i; 51             } 52         } 53         long left=0; 54         long right=0; 55         int num=0; 56  57         if(max>1){ 58                                //这里递归调用 59             left=getResult(word,dan,first,maxnum); 60  61             right= getResult(word, dan, maxnum+1, last); 62  63             res=left*max+right; 64  65         }else{ 66  67             for (int i = first; i < last; i++) { 68                 // 69                 String key= word[i]; 70                 switch (key) { 71                 case "zero": 72                     num += 0; 73                     break; 74                 case "one": 75                     num += 1; 76                     break; 77                 case "two": 78                     num += 2; 79                     break; 80                 case "three": 81                     num += 3; 82                     break; 83                 case "four": 84                     num += 4; 85                     break; 86                 case "five": 87                     num += 5; 88                     break; 89                 case "six": 90                     num += 6; 91                     break; 92                 case "seven": 93                     num += 7; 94                     break; 95                 case "eight": 96                     num += 8; 97                     break; 98                 case "nine": 99                     num += 9;100                     break;101                 case "ten":102                     num += 10;103                     break;104                 case "eleven":105                     num += 11;106                     break;107                 case "twelve":108                     num += 12;109                     break;110                 case "thirteen":111                     num += 13;112                     break;113                 case "fourteen":114                     num += 14;115                     break;116                 case "fifteen":117                     num += 15;118                     break;119                 case "sixteen":120                     num += 16;121                     break;122                 case "seventeen":123                     num += 17;124                     break;125                 case "eighteen":126                     num += 18;127                     break;128                 case "nineteen":129                     num += 19;130                     break;131                 case "twenty":132                     num += 20;133                     break;134                 case "thirty":135                     num += 30;136                     break;137                 case "forty":138                     num += 40;139                     break;140                 case "fifty":141                     num += 50;142                     break;143                 case "sixty":144                     num += 60;145                     break;146                 case "seventy":147                     num += 70;148                     break;149                 case "eighty":150                     num += 80;151                     break;152                 case "ninety":153                     num += 90;154                     break;155                 case "hundred":156                     break;157                 case "thousand":158                     break;159                 case "million":160                     break;161                 case "and":162                     break;163                 default:164                     break;165                 }                166             }//for167             res = num;168         }169 170         return res;171     }172 }173                 

 


测试结果如下,直接通过了。

明显的能感觉到java程序的效率和c/c++真没法比。

ACM解题之在线翻译 Give Me the Number