数字转换为汉字

题目要求:将数字转换为汉语读法,如“10001”转化为“一万零一”

输入限制:数字为正整数

面试公司:Amazon,豌豆荚

思路:

  对于每一进制单位(即'亿', '万', '千', '百', '十'),

  (1)首先递归调用transfer得到进制前面数字的汉字表示;

  (2)然后跟上进制; 

  (3)并将已处理的前面数字移去;

  (4)并判断剩下的数字前是否需要补零。

  最后对剩下的个位数字单独处理。

例子:

  20013,首先除以10000得到2,补上进制后得到“两万”;

  然后发现剩余的数字为10小于一千,因此补零得到“两万零”;

  接下来将13除以10为1,得到“两万零一十”,

  剩下一个3补在最后,得到最终结果“两万零一十三”。

 

语言:JAVA

 

 1 /**
 2  * @improved Kearnel
 3  * @author yuhan   http://supben.iteye.com/blog/1127770
 4  */
 5 public class Main {
 6 
 7     static final int[] DIGITS = {100000000, 10000, 1000, 100, 10};
 8     static final char[] READS = {'亿', '万', '千', '百', '十'};
 9     static final char[] FONTS = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' };
10 
11     /**
12      * 始终使用同一个StringBuilder可以减少字符串的生成和内存占用。
13      * @param number
14      * @return
15      */
16     static String transfer(long number) {
17         StringBuilder sb = new StringBuilder();
18         transfer(number, sb);
19         return sb.toString();
20     }
21     
22     
30     static void transfer(long number, StringBuilder sb){
31         
32         for (int i=0; i<DIGITS.length; i++) {
33             if (number >= DIGITS[i]) {
34                 sb.append(transfer(number / DIGITS[i]));
35                 sb.append(READS[i]);
36                 number %= DIGITS[i];
37                 if (number != 0 && number < DIGITS[i] / 10) {
38                     sb.append(FONTS[0]);
39                 }
40             }
41         }
42         if (number > 0) {
43             sb.append(FONTS[(int) number]);
44         }
45     }
46 
47     public static void main(String[] args) {
48         System.out.println(transfer(10101L));
49         System.out.println(transfer(13665543298L));
50         System.out.println(transfer(11130108005010800L));
51     }
52 }

 

posted @ 2014-06-09 20:59  开哪儿  阅读(483)  评论(0)    收藏  举报