Excel ,vim齐上阵,巧解欧拉计划17题:1到1000的英文字母个数

52 篇文章 0 订阅
15 篇文章 0 订阅

这个问题其实本身的难度不是很大:题目如下:

如果用英文写出数字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初步翻译:

绝望中我发现Excel也可以实现这个功能。网址如下:http://support.microsoft.com/kb/213360

鉴于以后可能还会用到,我把原文贴在文章的后面。

里面的原理就是利用Excel VBA写的代码复制过去以后,然后再excel中调用这个函数。

我们来看一看结果(其实有些不是很完美,所以用到vim的出场):



这里出现的结果有几点和我们的标准翻译不符合,当然我们要知道标准翻译时什么样子的,后面我也贴出来了

1.Dollars and No Cents,用vim删除的时候注意one 后面跟的是Dollar是单数的形式

2.Hundred后面应该跟着and

也就是说这个结果是不完全的,是要经过修改的,但是大部分内容还是给我翻译出来了


vim修饰

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合并所有的行

1000J


5删除所有的空格

:%s/s\//g

6.$把光标移动到行尾,看看结果就OK了



看右下角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

输入

【输入格式】

输入为一行,是一个十位以内的整数

输出

【输出格式】

 输出只有一行,为翻译的英文小写字母,每两个英文字母用空格隔开

样例输入

5678120000

样例输出

five billion six hundred and seventy-eight million one hundred and twenty thousand


如何在 Excel 中将数值转换为英文单词

本文包含 Microsoft Visual Basic for Applications 函数示例,您可以使用这些函数将 Microsoft Excel 工作表单元格中的数值转换为等效的英文单词。
Microsoft 提供的编程示例只用于演示目的,不带任何明示或暗示担保。这包括但不限于对适销性或特定用途适用性的暗示担保。本文假定您熟悉演示的编程语言以及用于创建和调试过程的工具。Microsoft 支持工程师可以帮助解释某个特定过程的功能。但是他们不会修改这些示例以提供额外的功能,也不会构建过程以满足您的特定要求。

如何创建名为 SpellNumber 的示例函数

  1. 启动 Microsoft Excel。
  2. 按 Alt+F11 启动 Visual Basic 编辑器。
  3. 在“插入”菜单上,单击“模块”。
  4. 在模块表中键入下面的代码。
    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
    					

如何使用 SpellNumber 示例函数

要使用该示例函数将某数字更改为书面文本,请使用下列示例中演示的方法之一:

方法 1:直接输入

通过将下面的公式输入单元格中,可以将 32.50 更改为“Thirty Two Dollars and Fifty Cents”:
=SpellNumber(32.50)

方法 2:单元格引用

可以引用工作簿中的其他单元格。例如,在单元格 A1 中输入数字 32.50,然后在另一单元格中键入下面的公式:
=SpellNumber(A1)

方法 3:粘贴函数或插入函数

可以使用“粘贴函数”(在 Excel 2000 和 Excel 2002 中)或“插入函数”(在 Excel 2003 中)来将自定义函数输入工作表中。
Excel 2000 和 Excel 2002
要使用“粘贴函数”,请按照下列步骤操作:
  1. 选择所需的单元格。
  2. 单击“常用”工具栏中的“粘贴函数”。
  3. 在“函数类别”下,单击“用户定义”。
  4. 在“函数名称”下,单击“SpellNumber”,然后单击“确定”。
  5. 输入所需的数字或单元格引用,然后单击“确定”。
  6. 单击“完成”。
Excel 2003
要使用“插入函数”,请按照下列步骤操作:
  1. 选择所需的单元格。
  2. 单击“常用”工具栏中的“插入函数”。
  3. 在“或选择类别”下,单击“用户定义”。
  4. 在“选择函数”列表中,单击“SpellNumber”,然后单击“确定”。
  5. 输入所需的数字或单元格引用,然后单击“确定”。


JS翻译代码:

<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=翻译 οnclick=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>



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值