2009-11-12 5 views
1

J'essaye d'écrire un nombre à trois chiffres en mots. Mais cela ne fonctionne pas si les deux premiers chiffres de droite sont entre 11 & 19 (les deux inclus).Imprimer le nombre en mots

Une aide?

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; 
} 

}

Répondre

2
  • Vous devez traiter spécialement zéro.
  • Vous utilisez modulo 10 dans le programme principal de test, vous ne voyez donc pas 11-20 dans la fonction appelée. En fait, il n'est pas clair que vous voyez 20, 30, 40, etc non plus.
  • Votre capitalisation est incohérente; Les bons programmeurs sont paranoïaques quant à la cohérence.
5

Pour un numéro à trois chiffres (positif ou négatif), il vous suffit de le diviser en sections et rappelez-vous que les nombres inférieurs à 20 sont spéciaux (dans n'importe quel bloc de cent). Comme pseudo-code (bien, Python, en fait, mais assez proche pseudo-code), nous définissons d'abord les tables de consultation:

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"] 

Notez qu'il n'y a pas onety pour les nombres entre dix et dix-neuf ans. Comme mentionné précédemment, les nombres de moins de vingt dans chaque bloc de cent sont traités spécialement. Ensuite, nous avons la fonction qui vérifie d'abord la valeur d'entrée et gère les nombres négatifs comme un appel récursif à un seul niveau. Il gère également le cas particulier de zéro:

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" 

La prochaine étape est de travailler les trois chiffres du numéro:

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

Des centaines sont simples, car il est seulement de zéro à neuf:

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

Le reste traite simplement des valeurs de zéro à dix-neuf comme spéciales, sinon nous le traitons comme X ty Y (comme forty two ou 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 

Et une suite de test rapide et sale au fond:

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

produit:

-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 
+0

Ajout de la version java – jjnguy

+0

+1 pour l'orthographe anglaise des nombres (par opposition à l'américain). Pour voir la différence, comparez les sorties pour 999 dans cette solution et la solution Java. [Je me souviens encore d'un livre de puzzles dans lequel l'une des réponses dépendait de l'absence de A apparaissant dans les nombres épelés jusqu'à ce que vous atteigniez 1000. Personne en Angleterre n'obtiendrait cette question correcte.] –

4

Voici le code en 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; 
} 
+0

Ça marche ... Je promets. – jjnguy

+0

Avant que quiconque ne décide de baisser la note pour fournir des solutions complètes pour les devoirs, n'oubliez pas que l'étiquette de devoir a été ajoutée * après * cette réponse, et * pas * par le PO. – paxdiablo

+0

Habituellement, je ne poste pas de code comme ça ... mais je l'avais juste écrit hier pour les devoirs. (Merci pax) – jjnguy

Questions connexes