数字转换为汉字
题目要求:将数字转换为汉语读法,如“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 }

浙公网安备 33010602011771号