闲来无事,就在51CTO上看Java设计模式,结果碰巧看到一道据传是亚马逊的笔试题,然后就想试试,由于个人的能力有限,就写了如下的结果,望批评指正。题目如下:
/**Given an integer between 0 – 999,999, print an English sentence that
* describes the integer, for example, input 10, the output is ten
* Note:
* Each word should be lower case, for example, one hundred and twenty,
* and there should be one and only one space between each word
* Samples:
* input: 1 output: one
* input: 23 output: twenty three
* input: 105 output: one hundred and five
* input: 12345 output: twelve thousand three hundred and forty five
* input: 123456 output: one hundred and twenty three thousand four hundred and fifty six
* Please complement the printNumber method in Solution class:
*/
然后他提供的代码是:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Solution {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
int num = Integer.parseInt(br.readLine());
printNumber(num);
isr.close();
br.close();
}
private static void printNumber(int num) {
}
}
要求在函数里把解法写上去。本来是想用递归的,结果感觉必须把结果写在函数里,然后就写了,基本的思路就是把数字分为1000以上和1000以下,然后分别判断。具体的代码如下:
private static void printNumber(int num) {
String Num_String = "", num1_s = "", num2_s = "";
String[] nums = {"", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten", "eleven", "twelve", "thirteen", "forteen",
"fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
String[] tenNums = {"ten","twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
if(num == 0){
System.out.println("zero");
return;
}
//----------------------------读后3位
int num2 = num % 1000;
if(num2 != 0){
if(num2/100 != 0 && num2%100!=0){//十位有数字
num2_s = nums[num2 / 100] + " hundred ";
}else if(num2/100 != 0 && num2%100==0 && num > 900){//后面没有数字
num2_s = "and " + nums[num2 / 100] + " hundred ";
}else if (num2/100 != 0 && num2%100==0) {
num2_s = nums[num2 / 100] + " hundred ";
}
if (num2%100 != 0) {//说明低两位有数字
if (num2 / 100!=0 || num > 900) {
num2_s = num2_s +"and ";
}
if (num2 % 100 >= 10) {//说明十位有数字
if(num2 % 100 <= 19){//如果是10~19
num2_s = num2_s + nums[10 + num2%10];
}else {//说明大于等于20
num2_s = num2_s + tenNums[(num2-100*(num2/100))/10-1] + " " + nums[num2%10];
}
}else {//说明只有个位有数字
num2_s = num2_s + nums[num2%10];
}
}
}
//----------------------------读前3位
int num1 = num / 1000;
if(num1 != 0){
if(num1/100 != 0){
num1_s = nums[num1 / 100] + " hundred ";
}
if (num1%100 != 0) {//说明低两位有数字
if (num1 / 100 != 0) {
num1_s = num1_s +"and ";
}
if (num1 % 100 >= 10) {//说明十位有数字
if(num1 % 100 <= 19){//如果是10~19
num1_s = num1_s + nums[10 + num1%10];
}else {//说明大于等于20
num1_s = num1_s + tenNums[(num1-100*(num1/100))/10-1] + " " + nums[num1%10];
}
}else {//说明只有个位有数字
num1_s = num1_s + nums[num1%10];
}
}
num1_s = num1_s + " thousand ";
}
Num_String = num1_s + num2_s;
System.out.println(Num_String.replaceAll(" ", ""));
}
网上那位网友的解法和我的不一样,但是效果一样,他用到了递归,然后代码也比我的简洁一点,现在把他的地址贴出来,大家也可以参考下。请猛戳这里。