这个问题其实本身的难度不是很大:题目如下:
如果用英文写出数字1到5: one, two, three, four, five, 那么一共需要3 + 3 + 5 + 4 + 4 = 19个字母。
如果数字1到1000(包含1000)用英文写出,那么一共需要多少个字母?
注意: 空格和连字符不算在内。例如,342 (three hundred and forty-two)包含23个字母; 115 (one hundred and fifteen)包含20个字母。"and" 的使用与英国标准一致。我首先的想法,写一个翻译数字成英文的程序,但是有点小难度,然后本着"不要重复造轮子的”理念,到网上看一看有没有能够翻译数字成英语的程序;还真找到了,有一个JS的程序可以非常好的完成这一任务。大家可以到这一网址去看看:http://www.pigzz.com/201011/111010602010.html,(在后面也贴出来了)非常的短小精悍,我有空会参考这个程序用perl实现这个功能,现在先解决第17题。
虽然这里能够翻译的很好,但是我并不会JS,或者说不会在perl中调用JS,这个程序对我没什么用处。
绝望中我发现Excel也可以实现这个功能。网址如下:http://support.microsoft.com/kb/213360
鉴于以后可能还会用到,我把原文贴在文章的后面。
里面的原理就是利用Excel VBA写的代码复制过去以后,然后再excel中调用这个函数。
我们来看一看结果(其实有些不是很完美,所以用到vim的出场):
这里出现的结果有几点和我们的标准翻译不符合,当然我们要知道标准翻译时什么样子的,后面我也贴出来了
1.Dollars and No Cents,用vim删除的时候注意one 后面跟的是Dollar是单数的形式
2.Hundred后面应该跟着and
也就是说这个结果是不完全的,是要经过修改的,但是大部分内容还是给我翻译出来了
1.我们先把所有的翻译好的结果复制到.txt文件中
2.删除Dollars and No Cents,代码如下:#别忘了删除one 后面的dollar
:%s/Dollars and No Cents//g
3.Hundred后面加and,(这里也有一个特殊情况,也就是整百后面不用and 所以要手动删除一下)
:%s/Hundred/Hundred and/g
4合并所有的行
1000J5删除所有的空格
:%s/s\//g
看右下角21124,就是结果,注意前面的1,表示的是第一行,别当成答案了。
【翻译规则】
n 对于三位以内的整数 (ABC),翻译的模式为 :
A=BC=0 => zero
A hundred and BC (A>0, BC>0)
BC (A=0,BC>0)
A hundred (A>0,BC=0)
对于两位数BC部分的翻译, 使用基本的数字翻译英文的规则即可
下面给出二位数内的英文翻译表
数字 |
英文 |
数字 |
英文 |
数字 |
英文 |
1 |
one |
2 |
two |
3 |
three |
4 |
four |
5 |
five |
6 |
six |
7 |
seven |
8 |
eight |
9 |
nine |
10 |
ten |
11 |
eleven |
12 |
twelve |
13 |
thirteen |
14 |
fourteen |
15 |
fifteen |
16 |
sixteen |
17 |
seventeen |
18 |
eighteen |
19 |
nineteen |
20 |
twenty |
30 |
thirty |
40 |
forty |
50 |
fifty |
60 |
sixty |
70 |
seventy |
80 |
eighty |
90 |
ninety |
对于其他的二位数BC,其翻译形式均为 B-C,例如28则翻译为 twenty-eight
n 对于一个长整数,可以把它从个位数字开始,每三位分为一组,例如:
5678120000 => 5,678,120,000
从右边向左边数,第一个逗号为 thousand ,第二个逗号为 million,第三个逗号为billion;
然后对每一组数字进行翻译,上面的四组数字分别为:
five , six hundred and seventy-eight , one hundred and twenty , zero
然后把逗号对应的单词补充并且串联起来:
five billion six hundred and seventy-eight million one hundred and twenty thousand zero
然后,把 连续的 zero (1个或者多个) 改为 and
five billion six hundred and seventy-eight million one hundred and twenty thousand and
最后,去掉最右边所有的 and
five billion six hundred and seventy-eight million one hundred and twenty thousand
【输入格式】
输入为一行,是一个十位以内的整数【输出格式】
输出只有一行,为翻译的英文小写字母,每两个英文字母用空格隔开
Option Explicit 'Main Function Function SpellNumber(ByVal MyNumber) Dim Dollars, Cents, Temp Dim DecimalPlace, Count ReDim Place(9) As String Place(2) = " Thousand " Place(3) = " Million " Place(4) = " Billion " Place(5) = " Trillion " ' String representation of amount. MyNumber = Trim(Str(MyNumber)) ' Position of decimal place 0 if none. DecimalPlace = InStr(MyNumber, ".") ' Convert cents and set MyNumber to dollar amount. If DecimalPlace > 0 Then Cents = GetTens(Left(Mid(MyNumber, DecimalPlace + 1) & _ "00", 2)) MyNumber = Trim(Left(MyNumber, DecimalPlace - 1)) End If Count = 1 Do While MyNumber <> "" Temp = GetHundreds(Right(MyNumber, 3)) If Temp <> "" Then Dollars = Temp & Place(Count) & Dollars If Len(MyNumber) > 3 Then MyNumber = Left(MyNumber, Len(MyNumber) - 3) Else MyNumber = "" End If Count = Count + 1 Loop Select Case Dollars Case "" Dollars = "No Dollars" Case "One" Dollars = "One Dollar" Case Else Dollars = Dollars & " Dollars" End Select Select Case Cents Case "" Cents = " and No Cents" Case "One" Cents = " and One Cent" Case Else Cents = " and " & Cents & " Cents" End Select SpellNumber = Dollars & Cents End Function ' Converts a number from 100-999 into text Function GetHundreds(ByVal MyNumber) Dim Result As String If Val(MyNumber) = 0 Then Exit Function MyNumber = Right("000" & MyNumber, 3) ' Convert the hundreds place. If Mid(MyNumber, 1, 1) <> "0" Then Result = GetDigit(Mid(MyNumber, 1, 1)) & " Hundred " End If ' Convert the tens and ones place. If Mid(MyNumber, 2, 1) <> "0" Then Result = Result & GetTens(Mid(MyNumber, 2)) Else Result = Result & GetDigit(Mid(MyNumber, 3)) End If GetHundreds = Result End Function ' Converts a number from 10 to 99 into text. Function GetTens(TensText) Dim Result As String Result = "" ' Null out the temporary function value. If Val(Left(TensText, 1)) = 1 Then ' If value between 10-19... Select Case Val(TensText) Case 10: Result = "Ten" Case 11: Result = "Eleven" Case 12: Result = "Twelve" Case 13: Result = "Thirteen" Case 14: Result = "Fourteen" Case 15: Result = "Fifteen" Case 16: Result = "Sixteen" Case 17: Result = "Seventeen" Case 18: Result = "Eighteen" Case 19: Result = "Nineteen" Case Else End Select Else ' If value between 20-99... Select Case Val(Left(TensText, 1)) Case 2: Result = "Twenty " Case 3: Result = "Thirty " Case 4: Result = "Forty " Case 5: Result = "Fifty " Case 6: Result = "Sixty " Case 7: Result = "Seventy " Case 8: Result = "Eighty " Case 9: Result = "Ninety " Case Else End Select Result = Result & GetDigit _ (Right(TensText, 1)) ' Retrieve ones place. End If GetTens = Result End Function ' Converts a number from 1 to 9 into text. Function GetDigit(Digit) Select Case Val(Digit) Case 1: GetDigit = "One" Case 2: GetDigit = "Two" Case 3: GetDigit = "Three" Case 4: GetDigit = "Four" Case 5: GetDigit = "Five" Case 6: GetDigit = "Six" Case 7: GetDigit = "Seven" Case 8: GetDigit = "Eight" Case 9: GetDigit = "Nine" Case Else: GetDigit = "" End Select End Function
<html> <head> <title>数字转换成英文的JavaScript 站长学院pigzz.com</title> <script> var arr1=new Array(""," thousand"," million"," billion") var arr2=new Array("zero","ten","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety") var arr3=new Array("zero","one","two","three","four","five","six","sever","eight","nine"); var arr4=new Array("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"); function Translate(num){ var len=num.length,i,j=0,strRet=""; var cols=Math.ceil(len/3); var first=len-cols*3 var strRet="" for(i=first;i<len;i+=3){ ++j; if(i>=0) num3=num.substring(i,i+3) else num3=num.substring(0,first+3) strEng=English(num3) if(strEng!=""){ if(strRet!="") strRet+="," strRet+=English(num3)+arr1[cols-j] } } return strRet } function English(num){ strRet="" if((num.length==3) && (num.substr(0,3)!="000")){ if((num.substr(0,1)!="0")){ strRet+=arr3[num.substr(0,1)]+" hundred" if(num.substr(1,2)!="00")strRet+=" and " } num=num.substring(1); } if((num.length==2)){ if((num.substr(0,1)=="0")){ num=num.substring(1) } else if((num.substr(0,1)=="1")){ strRet+=arr4[num.substr(1,2)] } else{ strRet+=arr2[num.substr(0,1)] if(num.substr(1,1)!="0")strRet+="-" num=num.substring(1) } } if((num.length==1) && (num.substr(0,1)!="0")){ strRet+=arr3[num.substr(0,1)] } return strRet; } </script> </head> <body> <input id=number value=654321><input type=button value=翻译 onclick=alert(Translate(document.all.number.value))> <p>小猪站长学院致力于网页标准的传播,提供DIV CSS XHTML等学习教材,标准化的网页代码</p> <p>符合W3C标准的网页设计,提供建站资源,设计字体等资源下载的综合性站长学习平台</p> <p>你所下载的代码来自<a href="http://www.pigzz.com" _fcksavedurl="http://www.pigzz.com">小猪站长学院</a> ,欢迎下载 使用</p> </body> </html>