Распечатать номер словами [закрыто]

Я пытаюсь код, чтобы напечатать трехзначное число в словах. Но это неt работает, если первые две цифры справа находятся между 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 stack=new Stack();
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;
}

Ответы на вопрос(4)

Это'сделано и опубликовано, чтобы вы могли получить пользу:

http://www.rgagnon.com/javadetails/java-0426.html

https://sourceforge.net/projects/numberreader/

 abhishek12 нояб. 2009 г., 06:55
кажется немного сложным
 Andreas_D12 нояб. 2009 г., 09:04
Определенно нет. Чистый и понятный код.
 Christian d'Heureuse20 июл. 2012 г., 12:14
Я написал более чистую версию:source-code.biz/snippets/java/13.htm
Вы должны относиться к нулю специально.Вы используете модуль 10 в основной тестовой программе, поэтому вы несм. 11-20 в вызываемой функции. На самом деле, не ясно, что вы видите 20, 30, 40 и т. Д.Ваша капитализация противоречива; Хорошие программисты параноики по поводу последовательности.

Вот код на 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;
}
 Bart Kiers12 нояб. 2009 г., 11:43
Я не собираюсь опускать ни одного из ваших ответов, но я могуне вижу, как это моглоНЕ быть домашней работой С или безhomework тег. Если ОП решит слепо скопировать и вставить это и передать как свое собственное, я надеюсь, что учитель найдет этот пост в этом посте. :)
 jjnguy12 нояб. 2009 г., 11:50
Также спасибо за очистку кода до pax.
 paxdiablo12 нояб. 2009 г., 08:39
Прежде чем кто-либо решит понизить это значение для обеспечения полного решения домашних заданий, помните, что тег домашней работы был добавленпосле этот ответ ине по ОП.
 jjnguy12 нояб. 2009 г., 08:43
Обычно я нет почтовый код, как это ... но я на самом деле только что написал его вчера для домашней работы. (Спасибо, чел) я
 jjnguy12 нояб. 2009 г., 11:48
Я представляю код в качестве рабочего примера. Я надеюсь, что это не скопировано непосредственно в домашнее задание.
 jjnguy12 нояб. 2009 г., 07:28
Это работает ... Я обещаю.

Для трехзначного числа (отрицательного или положительного) вам просто нужно разделить его на разделы и помнить, что числа меньше 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"]

Обратите внимание, что тамнет нет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 = ""

Остальное - просто обрабатывать значения от нуля до девятнадцати как особые, в противном случае мы рассматриваем это какXтиY (лайкforty two или жеseventy 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
 Jonathan Leffler12 нояб. 2009 г., 14:23
+1 для английского написания чисел (в отличие от американского). Чтобы увидеть разницу, сравните выходные данные для 999 в этом решении и решении Java. [Я до сих пор помню книгу головоломок, в которой один из ответов зависел от «А»появляются в записанных числах, пока вы не достигнете 1000. Никто в Англии не мог бы ответить на этот вопрос правильно.]
 jjnguy12 нояб. 2009 г., 07:16
Добавлена Java-версия

Ваш ответ на вопрос