黑马程序员技术交流社区

标题: 这是我做的一道入学测试题 [打印本页]

作者: 静水流华    时间: 2014-10-6 08:34
标题: 这是我做的一道入学测试题
题目为:10、  金额转换,阿拉伯数字转换成中国传统形式。

例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
下面是结题思路及过程:

作者: 静水流华    时间: 2014-10-6 08:36
  1. package com.it.heima;
  2. /*10、  金额转换,阿拉伯数字转换成中国传统形式。

  3. 例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
  4. 思路分析:输入的字符串如果不非法,那么各个数字对应的有个、十、百、千、万等的单位。例如"12345"中1对应的是万位2对应的是千位3对应的是百位
  5. 4对应的是十位5对应的是各位。我们转译的时候就可以将对应的数字字符和对应的单位字符组合在一起,形成转译后的结果。
  6. 编程过程:1.将输入的字符转换为字符串
  7.                 2.制作对应的映射字表
  8.                 3.对各种可能出现的情况进行分析(1>输入的不是纯数字字符2>输入的字符首字符为0且字符的长度不为1
  9.                         3>输入的字符中间连续出现0  4>输入的字符结尾为0)
  10. */

  11. import java.util.*;
  12. import java.io.*;
  13. public class Test10 {

  14.         public static void main(String[] args) throws IOException, NumberFormatException,
  15.                                                                                                 MyException{
  16.                 // TODO 自动生成的方法存根
  17.                 Map<Integer,String> map=null;
  18.                 Map<Character,String> map1=null;
  19.                 //单位映射表
  20.                                 map=new HashMap<Integer,String>();
  21.                                 String[] str1={"兆","仟亿","佰亿","拾亿","亿","千萬","百萬","拾萬","萬","仟","佰","拾","圆"};
  22.                                 int i=0;
  23.                                 for(i=0;i<str1.length;i++){
  24.                                         map.put(i,str1[str1.length-i-1]);
  25.                                 }
  26.                                 //数字映射表
  27.                                 map1=new HashMap<Character,String>();
  28.                                 map1.put('0',"零");
  29.                                 map1.put('1',"壹");
  30.                                 map1.put('2',"貳");
  31.                                 map1.put('3',"叁");
  32.                                 map1.put('4',"肆");
  33.                                 map1.put('5',"伍");
  34.                                 map1.put('6',"陸");
  35.                                 map1.put('7',"柒");
  36.                                 map1.put('8',"捌");
  37.                                 map1.put('9',"玖");
  38.                 while(true){       
  39.                 //将输入的数字转换为字符串
  40.                 BufferedReader br=new BufferedReader
  41.                                 (new InputStreamReader(System.in));
  42.                 String str=null;
  43.                 //String str2=null;
  44.                 StringBuilder sb=new StringBuilder();
  45.                
  46.                 int len=0;
  47.                 try {
  48.                         str=br.readLine();
  49.                         len=str.length();//获取字符串的长度                               
  50.                         Long.parseLong(str);//判断是否输入的是否为字符串如果是非法字符那么将抛出异常
  51.                         if(len!=1&str.charAt(0)=='0'){
  52.                                 throw new MyException("出现非法数字");//如果输入的字符串例如05、062等以0开头的数字字符那么将报异常
  53.                         }
  54.                         if(len>13){
  55.                                 System.out.println("对不起超出映射表范围");
  56.                         }
  57.                         for(int j=0;j<len;j++){
  58.                                 if(str.charAt(len-j-1)!='0'){
  59.                                         sb.insert(0,map.get(j));//添加单位
  60.                                         sb.insert(0,map1.get(str.charAt(len-1-j)));//添加数字的映射
  61.                                 }else{
  62.                                 while(str.charAt(len-j-1)=='0'){//思路:在结果中会出现不规则现象比如说:30030的结果为“叁万零零三十元”
  63.                                         j++;                                                //这段代码就是为了解决这个问题如果有连续几个0出现那么在查表后只保留一个0
  64.                                 }sb.insert(0,"零");
  65.                                         j--;        //让j的取值恢复以便进入for循环的j++中
  66.                         }}
  67.                         if(sb.charAt(sb.length()-1)=='零'){
  68.                                 sb.deleteCharAt(sb.length()-1);//如果结尾处为'零',那么将零删除
  69.                                 sb.append('圆');
  70.                         }
  71.                         System.out.println(sb+"整");
  72.                 } catch (IOException e) {
  73.                         // TODO 自动生成的 catch 块
  74.                         e.printStackTrace();
  75.                 }catch(NumberFormatException e){
  76.                         System.out.println("输入的不是数字!");
  77.                 }catch(MyException e){
  78.                         System.out.println("输入的数字非法!");
  79.                 }
  80.                 }
  81.                
  82.                 }}
  83. class MyException extends Exception{
  84.         MyException(String str){
  85.                 super(str);
  86.         }
  87.        
  88. }
  89.                
  90.        



复制代码

作者: 爽朗的菜籽    时间: 2014-10-6 09:33
我擦。。好复杂,这就是入学测试的水准么 感觉学了基础之后完全没有思路啊。。有什么建议么楼主大大

作者: 残羹夜宴丶    时间: 2014-10-6 11:28
遇到这种题果断无力啊,还是觉得思路是难题。
作者: 郑飞    时间: 2014-10-6 13:29
哈哈 自己吓自己 有些代码好几行就一个知识点的 入学测试基本也是考那么一两个知识点 这是最后一两题的难度 是相对复杂点
作者: 各有千秋    时间: 2014-10-6 13:33
这个有点吓人
作者: FlyFish    时间: 2014-10-6 14:00
好吓人!!
作者: yangzhong1991    时间: 2014-10-6 15:22
一点也没办法的感觉...
作者: 爱的承诺    时间: 2014-10-6 15:40
这么难啊
作者: weiyi    时间: 2014-10-6 16:33
无力啊 好复杂
作者: 646245771    时间: 2014-10-6 18:14
  1. package com.itheima04;

  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;

  4. public class Test13 {

  5.         public static void main(String[] args) throws Exception{
  6.                
  7.                 /*
  8.                  * 金额转换,阿拉伯数字转换成中国传统形式。
  9.                  */
  10.                
  11.                 getString();       
  12.         }

  13. //        键盘录入,获取数字字符
  14.         public static void getString() throws Exception{
  15.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  16.                
  17.                 String line = null;
  18.                 while((line=bufr.readLine())!=null){
  19. //                        定义一个结束标记
  20.                         if(line.equalsIgnoreCase("over"))
  21.                                 break;
  22.                         String regex = "\\d+";
  23.                        
  24.                         if(line.matches(regex)){
  25.                                 getValue(line);
  26.                         } else {
  27.                                 System.out.println("您输入的不是数字,请重新输入!");
  28.                         }
  29.                 }
  30.                
  31.         }
  32.        
  33. //        数字转换功能
  34.         private static void getValue(String string) {
  35.                
  36.                 char[] ch1 = {'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};
  37.                
  38.                 char[] ch2 = string.toCharArray();
  39.                 for (int i = 0; i < ch2.length; i++) {
  40. //                        获取字符数组中每个角标对应的值
  41.                         char c = ch2[i];
  42. //                        将对应的字符转成int
  43.                         int index = Integer.parseInt(String.valueOf(c));
  44.                        
  45. //                        把这些转成int 的值当做角标,去获取对应的中文。
  46.                         char value = ch1[index];
  47.                         System.out.print(value);
  48.                 }

  49. //                换行
  50.                 System.out.println("");
  51.         }

  52. }
复制代码


看你写的貌似有点麻烦,这是我看到你的题目之后,写的,你可以看看。
作者: 静水流华    时间: 2014-10-6 19:54
646245771 发表于 2014-10-6 18:14
看你写的貌似有点麻烦,这是我看到你的题目之后,写的,你可以看看。

将数字转换成角标,思路很好学习了,但是你可以再好好看看题目不是简单的字符转换。
作者: 静水流华    时间: 2014-10-6 19:56
爽朗的菜籽 发表于 2014-10-6 09:33
我擦。。好复杂,这就是入学测试的水准么 感觉学了基础之后完全没有思路啊。。有什么建议么楼主大大
...

没什么复杂的,发出来就是想学习一下别人的结题思路
作者: 646245771    时间: 2014-10-6 23:09
静水流华 发表于 2014-10-6 19:54
将数字转换成角标,思路很好学习了,但是你可以再好好看看题目不是简单的字符转换。 ...

没仔细看题:L
作者: 这个夏天的芬芳    时间: 2014-10-7 22:36
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
作者: zz_job    时间: 2014-10-7 23:29
求思路及过程  谢谢
作者: Carter    时间: 2014-10-8 00:00
这个题关键的还是算法




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2