【问题标题】:Print number in words [closed]用文字打印数字[关闭]
【发布时间】:2009-11-12 05:16:24
【问题描述】:

我正在尝试用文字打印一个三位数的代码。 但是,如果右边的前两位数字在 11 和 19 之间(都包括),则这不起作用。

有什么帮助吗?

package com;

import java.util.Stack;

public class TestMain {
public static void main(String[] args) {

Integer i=512;
int temp =i;int pos=1;
Stack<String> stack=new Stack<String>();
while(temp>0){

    int rem=temp%10;
    temp=temp/10;
    if(rem!=0){stack.push(getString(rem, pos));}
    pos*=10;
}
do{
    System.out.print(stack.pop()+" ");
}while(!stack.isEmpty());



}
static String getString(int i,int position){
    String str=null;

    if(position==10){
        i*=position;
    }

    switch(i){
    case 1:
        str= "One";break;

    case 2:
        str= "two";break;
    case 3:
        str= "three";break;
    case 4:
        str= "four";break;
    case 5:
        str= "five";break;
    case 6:
        str= "six";break;
    case 7:
        str= "seven";break;
    case 8:
        str= "eight";break;
    case 9:
        str= "nine";break;
    case 10:
        str= "Ten";break;
    case 11:
        str= "Eleven";break;
    case 12:
        str= "Twelve";break;
    case 13:
        str= "thirteen";break;
    case 14:
        str= "fourteen";break;
    case 15:
        str= "fifteen";break;
    case 16:
        str= "sixteen";break;
    case 17:
        str= "seventeen";break;
    case 18:
        str= "eighteen";break;
    case 19:
        str= "Nineteen";    break;
    case 20:
        str= "twenty";break;
    case 30:
        str= "Thirty";break;
    case 40:
        str= "forty";break;
    case 50:
        str= "Fifty";break;
    case 60:
        str= "sixty";break;
    case 70:
        str= "Seventy";break;
    case 80:
        str= "Eighty";  break;
    case 90:
        str= "Ninety";break;
    case 100:
        str= "Hundred";
        break;
    }
    if(position>=100){
    str=str+ " "+getString(position, 0);
    }
    return str;
}

}

【问题讨论】:

    标签: java


    【解决方案1】:

    对于一个三位数的数字(负数或正数),您只需将其分成多个部分,并记住小于 20 的数字是特殊的(在任何一百个块中)。作为伪代码(好吧,Python,实际上但足够接近伪代码),我们首先定义查找表:

    nums1 = ["","one","two","three","four","five","six","seven",
             "eight","nine","ten","eleven","twelve","thirteen",
             "fourteen","fifteen","sixteen","seventeen","eighteen",
             "nineteen"]
    nums2 = ["","","twenty","thirty","forty","fifty","sixty",
             "seventy","eighty","ninety"]
    

    请注意,对于 10 到 19 之间的数字,没有 onety。如前所述,一百个中的每一块中的二十以下的数字都经过特殊处理。

    然后我们有一个函数,它首先检查输入值并将负数作为一级递归调用处理。它还处理零的特殊情况:

    def speak (n):
        if n < -999 or n > 999:
            return "out of range"
    
        if n < 0:
            return "negative " + speak (-n)
    
        if n == 0:
            return "zero"
    

    下一步是计算数字中的三位数字:

        hundreds = int (n / 100)
        tens = int ((n % 100) / 10)
        ones = n % 10
    

    数百很简单,因为它只是从零到九:

        if hundreds > 0:
            retstr = nums1[hundreds] + " hundred"
            if tens != 0 or ones != 0:
                retstr = retstr + " and "
        else:
            retstr = ""
    

    其余的只是简单地将从零到十九的值视为特殊值,否则我们将其视为Xty Y(如forty twoseventy seven):

        if tens != 0 or ones != 0:
            if tens < 2:
                retstr = retstr + nums1[tens*10+ones]
            else:
                retstr = retstr + nums2[tens]
                if ones != 0:
                    retstr = retstr + " " + nums1[ones]
        return retstr
    

    底部有一个快速而肮脏的测试套件:

    for i in range (-1000, 1001):
        print "%5d %s"%(i, speak (i))
    

    产生:

    -1000 out of range
     -999 negative nine hundred and ninety nine
     -998 negative nine hundred and ninety eight
        : 
       -2 negative two
       -1 negative one
        0 zero
        1 one
        2 two
        :
       10 ten
       11 eleven
       12 twelve
        :
      998 nine hundred and ninety eight
      999 nine hundred and ninety nine
     1000 out of range
    

    【讨论】:

    • +1 表示数字的英文拼写(与美国相反)。要查看差异,请比较此解决方案和 Java 解决方案中 999 的输出。 [我还记得一本谜题书,其中一个答案取决于拼出的数字中没有出现 A,直到你达到 1000。英格兰没有人会正确回答这个问题。]
    【解决方案2】:

    这是Java代码:

    private static String[] DIGIT_WORDS = {
        "zero", "one", "two", "three", "four",
        "five", "six", "seven", "eight", "nine" };
    private static String[] TENS_WORDS = {
        "ten", "twenty", "thirty", "forty", "fifty",
        "sixty", "seventy", "eighty", "ninety" };
    private static String[] TEENS_WORDS = {
        "ten", "eleven", "twelve", "thirteen", "fourteen",
        "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
    
    private static String getHundredWords(int num) {
        if (num > 999 || num < 0)
            throw new IllegalArgumentException(
                "Cannot get hundred word of a number not in the range 0-999");
        if (num == 0) return "zero";        
        String ret = "";
        if (num > 99) {
            ret += DIGIT_WORDS[num / 100] + " hundred ";
            num %= 100;
        }
        if (num < 20 && num > 9) {
            ret += TEENS_WORDS[num % 10];
        } else if (num < 10 && num > 0) {
            ret += DIGIT_WORDS[num];
        } else if (num != 0) {
            ret += TENS_WORDS[num / 10 - 1];
            if (num % 10 != 0) {
            ret += " " + DIGIT_WORDS[num % 10];
        }}
    
        return ret;
    }
    

    【讨论】:

    • 在任何人决定否决这个为家庭作业提供完整解决方案之前,请记住家庭作业标签是在 这个答案之后添加的,而 not 是由OP。
    • 通常我不会发布这样的代码......但实际上我昨天刚刚写了它作为家庭作业。 (谢谢帕克斯)
    • 我不会对你的任何一个答案投反对票,但我看不出这怎么可能不是是家庭作业。有或没有homework 标签。如果 OP 决定盲目地复制和粘贴这个并将其作为他/她自己的,我希望老师用谷歌搜索他或她的方式进入这篇文章。 :)
    • 我提交代码作为一个工作示例。我希望它不会直接复制到家庭作业中。
    • 另外,感谢您清理 pax 的代码。
    【解决方案3】:
    • 你必须特别对待零。
    • 您在测试主程序中使用模 10,因此在调用函数中看不到 11-20。实际上,您看到的 20、30、40 等也不清楚。
    • 您的大小写不一致;优秀的程序员偏执于一致性。

    【讨论】:

      【解决方案4】:

      【讨论】:

      猜你喜欢
      • 2021-02-20
      • 2015-09-17
      • 1970-01-01
      • 2019-12-20
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多