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

3
one
eleven
one hundred and two

Sample Output

1
11
102

贴上题目的地址:

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*1004.上面的数都比较特殊,也是基本单位,然后就是推广了。  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             }//for
167             res = num;
168         }
169
170         return res;
171     }
172 }
173                 


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

明显的能感觉到java程序的效率和c/c++真没法比。
时间: 2024-11-09 00:30:23

ACM解题之在线翻译 Give Me the Number的相关文章

如何可以将PDF文件在线翻译成中文?

有时心血来潮,会在网上搜索一些专业的影评.杂志等资料,像这些资料格式PDF的多一些,而且有时还会看到纯英文版的,这样想利用起来,就必须要使用一些工具的帮助,就可以轻松的完成翻译的任务,让我们使用起来更轻松.不用下载,直接在网页上面就可以完成,非常的方便,一起来学习一下吧.     在线PDF翻译,可以直接把PDF.Word翻译成中文.英文.繁体中文等多国语言的文档.用户可自定义目标语言,翻译后的文档可以精确保留原文件的所有页面元素和排版.用户可以在短时间之内下载到转换之后的文件.只要用户可以连接

Python Web中REST API使用示例——基于云平台+云服务打造自己的在线翻译工具

做为一个程序员可能在学习技术,了解行业新动态,解决问题时经常需要阅读英文的内容:而像我这样的英文小白就只能借助翻译工具才能理解个大概:不禁经常感慨,英文对学习计算机相关知识太重要了!最近发现IBM的云平台Blumemix,并且提供语言翻译的服务,感觉不错,就拿来研究学习一下:这里就分享一下我的研究学习过程,如何使用Python调用REST API打造自己的在线翻译工具,并演示如何把它发布到云平台上,让每个人都可以通过网络访问使用它. 应用效果展示 您可以通过点击效果图片的链接访问它. 构建一个类

Ruby On Rails中REST API使用示例——基于云平台+云服务打造自己的在线翻译工具

做为一个程序员可能在学习技术,了解行业新动态,解决问题时经常需要阅读英文的内容:而像我这样的英文小白就只能借助翻译工具才能理解个大概:不禁经常感慨,英文对学习计算机相关知识太重要了!最近发现IBM的云平台Blumemix,并且提供语言翻译的服务,感觉不错,就拿来研究学习一下:这里就分享一下我的研究学习过程,如何使用Ruby On Rails调用REST API打造自己的在线翻译工具,并演示如何把它发布到云平台上,让每个人都可以通过网络访问使用它. 应用效果展示 您可以通过点击效果图片的链接访问它

基于云平台+云服务打造自己的在线翻译工具

做为一个程序员可能在学习技术,了解行业新动态,解决问题时经常需要阅读英文的内容:而像我这样的英文小白就只能借助翻译工具才能理解个大概:不禁经常感慨,英文对学习计算机相关知识太重要了!最近发现IBM的云平台Blumemix,并且提供语言翻译的服务,感觉不错,就拿来研究学习一下:这里就分享一下我的研究学习过程,如何使用Java语言调用Web Service打造自己的在线翻译工具,并演示如何把它发布到云平台上, 让每个人都可以通过网络访问使用它. 应用效果展示 您可以通过点击效果图片的链接访问它. 构

推荐个小应用《远程桌面+笔记+在线翻译》

自己开发的一个小应用,使用了段时间慢慢又感觉了跟大家分享个.主要功能远程桌面+笔记+在线翻译. 1.远程桌面 工作的原因,平时需要用到远程桌面还比较频繁的那种.一开始都是复制黏贴账号密码.时间久了次数多了比较烦躁.那好吧开发个功能.效果就是数据维护到系统然后点连接就OK了 2.笔记 好记性不如烂笔头,况且自我感觉记性也不大好.平时工作中的点点滴滴,没事记记.代码最好要能保留着色.还能传个demo或小附件啥的.数据要能分类啊.这样又开发了个功能  3.在线翻译 英语不好,平时老要查下单次或翻译个句

Node.js中REST API使用示例——基于云平台+云服务打造自己的在线翻译工具

做为一个程序员可能在学习技术,了解行业新动态,解决问题时经常需要阅读英文的内容:而像我这样的英文小白就只能借助翻译工具才能理解个大概:不禁经常感慨,英文对学习计算机相关知识太重要了!最近发现IBM的云平台Blumemix,并且提供语言翻译的服务,感觉不错,就拿来研究学习一下:这里就分享一下我的研究学习过程,如何使用Node.js调用REST API打造自己的在线翻译工具,并演示如何把它发布到云平台上,让每个人都可以通过网络访问使用它. 应用效果展示 您可以通过点击效果图片的链接访问它. 构建一个

一些具非常有用源代码分享(百度指数破解(最新版),NDIS实现类似P2P终结者功能代码,GOOGLE在线翻译等等)

最近自己要去深圳,开始人生的第二份工程,所以整理以前自己写过的小玩意代码(跟自己工作的代码无关),自己下班回家写的代码,准备卸载简历里面去求职.代码风格自己有注意,但还是每次看自己以前写的代码就感觉是那么丑. 1:NDIS实现类似P2P终结者的核心代码. 说明:最近辞职以后在写东西,自己开始玩驱动开发,发现还是没有想象中难,但环境还是比应用层开发环境还是差多了,要非常注意内存的一些细节,不然很容易导致蓝屏.还有就是NDIS 中间层资料太少,中国书籍有一定的介绍,但只是简单的代码,而那些扩展的Pa

asp.net c#轻松调用百度在线翻译功能

首先去百度:注册个apikey http://developer.baidu.com/wiki/index.php?title=%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E9%A6%96%E9%A1%B5/%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91API 获取代码: 添加如下代码: using System; using System.Collections.Generic; using System.Linq; using Syst

关于网站调用在线翻译api实现翻译功能

在做一些网站的时候偶尔会遇到需要中英文翻译的部分,也许是提供用户在线翻译的功能,也可能是把用户输入的一整段文字进行翻译.小龙最近就遇到这么一个事儿,对接中外两方用户的沟通,为了对语言不那么顺畅的用户提供一点点帮助,在网站里嵌入了自动翻译的功能,就简化了用户复制黏贴,再打开百度翻译的步骤了. 小龙用的是有道提供的api,普通用户就可以免费使用的.有道提供了网页模块的调用法和数据接口型的,网页模块的会比较简单一些,在他们官网上把写好的代码复制进html就好,这边简单展开以下数据接口型的调用. 首先,