问题描述
我正在尝试使用单词打印三位数的代码。
但如果右边的前两位数介于11和11之间,则无效。 19(包括)。
I am trying code to print a three digit number in words.But this isn't working if first two digits from right are between 11 & 19 (both including).
任何帮助?
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;
}
}
推荐答案
对于三位数字(负数或正数),您只需要将其分成几个部分,并记住小于20的数字是特殊的(在任何一百个数字中)。作为伪代码(嗯,Python,实际上但足够接近伪代码),我们首先定义查找表:
For a three-digit number (negative or positive), you just need to divide it into sections and remember that numbers less than 20 are special (in any block of a hundred). As pseudo-code (well, Python, actually but close enough to pseudo-code), we first define the lookup tables:
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
。如前所述,每百个块中的二十个以下的数字是专门处理的。
Note that there's no onety
for numbers between ten and nineteen. As previously mentioned, numbers under twenty in each block of a hundred are treated specially.
然后我们有一个函数,它首先检查输入值并处理负数作为一个级递归调用。它还处理零的特殊情况:
Then we have the function which first checks the input value and handles negative numbers as a one-level recursive call. It also handles the special case of zero:
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"
下一步是算出数字中的三位数:
Next step is to work out the three digits in the number:
hundreds = int (n / 100)
tens = int ((n % 100) / 10)
ones = n % 10
数百个很简单,因为它只有零到九:
Hundreds are simple since it's only zero through nine:
if hundreds > 0:
retstr = nums1[hundreds] + " hundred"
if tens != 0 or ones != 0:
retstr = retstr + " and "
else:
retstr = ""
其余的只是将零到十九的值视为特殊值,否则我们将其视为 X
ty Y
(如四十二
或七十七
):
The rest is simply treating values from zero to nineteen as special, otherwise we treat it as X
ty Y
(like forty two
or 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
快速和底部的脏测试套件:
And a quick and dirty test suite at the bottom:
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
这篇关于用文字打印数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!