A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 静水流华 中级黑马   /  2014-10-6 08:34  /  2326 人查看  /  16 人回复  /   3 人收藏 转载请遵从CC协议 禁止商业使用本文

题目为:10、  金额转换,阿拉伯数字转换成中国传统形式。

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

16 个回复

倒序浏览
  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.        



复制代码

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我擦。。好复杂,这就是入学测试的水准么 感觉学了基础之后完全没有思路啊。。有什么建议么楼主大大
回复 使用道具 举报
遇到这种题果断无力啊,还是觉得思路是难题。
回复 使用道具 举报
哈哈 自己吓自己 有些代码好几行就一个知识点的 入学测试基本也是考那么一两个知识点 这是最后一两题的难度 是相对复杂点
回复 使用道具 举报
这个有点吓人
回复 使用道具 举报
好吓人!!
回复 使用道具 举报
一点也没办法的感觉...
回复 使用道具 举报
这么难啊
回复 使用道具 举报
weiyi 中级黑马 2014-10-6 16:33:19
10#
无力啊 好复杂
回复 使用道具 举报
  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. }
复制代码


看你写的貌似有点麻烦,这是我看到你的题目之后,写的,你可以看看。
回复 使用道具 举报
646245771 发表于 2014-10-6 18:14
看你写的貌似有点麻烦,这是我看到你的题目之后,写的,你可以看看。

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

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

没仔细看题:L
回复 使用道具 举报
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
回复 使用道具 举报
求思路及过程  谢谢
回复 使用道具 举报
这个题关键的还是算法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马