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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 振飞 初级黑马   /  2014-7-25 21:31  /  1209 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 振飞 于 2014-7-25 22:09 编辑

这是我的基础试题中的一题,题目要求输入123输出一二三 但是我的这个如果输入0123只能输出一二三 所以求学哥学姐帮忙优化下!!
import java.util.Scanner;
class  Demo
{
        public static void main(String[] args)
        {
                Scanner sc = new Scanner(System.in);
                System.out.print("请你输入数字:");
                int num=sc.nextInt();
                int [] arr1=new int [32];
                int x=arr1.length-1;
                String num1 ="";
                char [] arr ={'零','一','二','三','四','五',
                        '六','七','八','九'};
                do
                {
                arr1[x]=num%10;
                num/=10;
               
                if (num==0)
                {
                        break;
                }
                x--;
                }
                while (true);
                for (int y=x;y<arr1.length ;y++ )
                {
                        

                        num1+=arr[arr1[y]];
                }
                System.out.println("大写数字:"+num1);

        }
}


评分

参与人数 1技术分 +1 收起 理由
格子、 + 1

查看全部评分

16 个回复

倒序浏览
do
                {
                arr1[x]=num%10;
                num/=10;
   这里少了什么东西吧,我觉得你写得太复杂了,我说说我的思路吧,你先定义一个stringbuffer,然后用输入的整数去除10,根据其余数在stringbuffer加入对应的大写数字,然后在调用stringbuffer的reverse方法就可以得到结果了
回复 使用道具 举报
本帖最后由 依然超级赛亚人 于 2014-7-25 22:03 编辑

没有输出“零”应该是数字“0”没有存到你的相应数组中,因为程序在判断完num==0就break了,num值没有存进去,您看我下面改进后这段程序可以吗?代码如下:

import java.util.Scanner;
class  Demo
{
        public static void main(String[] args)
        {
                Scanner sc = new Scanner(System.in);
                System.out.print("请你输入数字:");
                int num=sc.nextInt();
                int [] arr1=new int [32];
                int x=arr1.length-1;
                String num1 ="";
                char [] arr ={'零','一','二','三','四','五',
                        '六','七','八','九'};
                do
                {
                     if(num!=0){//这里多加了一个判断的“外套”括号中的代码是原来的。
                     arr1[x]=num%10;
                     num/=10;
                     }
               
                   else if (num==0) {        
                       arr1[x]=num;//这里在您原来基础上把0存进了数组。
                        break;
                      }
                x--;
                }
                while (true);
                for (int y=x;y<arr1.length ;y++ )
                {
                        

                        num1+=arr[arr1[y]];
                }
                System.out.println("大写数字:"+num1);

        }
}
回复 使用道具 举报
vaqh 发表于 2014-7-25 21:57
do
                {
                arr1[x]=num%10;

我还是没看到那 所以不会那个方法!!
回复 使用道具 举报
依然超级赛亚人 发表于 2014-7-25 21:59
没有输出“零”应该是数字“0”没有存到你的相应数组中,因为程序在判断完num==0就break了,num值没有存进 ...

偶了 !! Thank you !!
回复 使用道具 举报
学习到了。。。
回复 使用道具 举报
:dizzy::(不好意思,我上面的程序并不对,我想了一下,我是把0一直都存在里面了,所以你即使输入123,它也会输出“零一二三”,“0”始终在数组里,所以大写“零”也会随着任何数输出来,您可以试试.....误人子弟了,真的不好意思,太草率了,没有多验证几个数。
不过,我不明白的是,你的这个程序来说,按理说不能输入以"0"开头的阿拉伯数字才对啊,以"0“开头的数字虽然int可以接受,但已经不是我们平时用的十进制数了,而是八进制数,所以,输入”0123“的话不能当”123“用啊?
这个程序不输出0开头的数是没问题的,否则就会有问题了,现在我暂时还不知怎么解决,看看其他人的解决方式吧,不好意思。
回复 使用道具 举报
@for 中级黑马 2014-7-26 00:33:40
8#
。。。。。。。。。。。。
回复 使用道具 举报
wisely 中级黑马 2014-7-26 03:50:45
9#
这个题目有个陷阱,很多人都跳进去鸟,俺也跳进去n回。

陷阱1:不能用算术运算的方法来做,如a/=10,因为你输入的可能是001245,前面是0,你就挂了。
陷阱2:int型,如果输入的数字超过了int型的极限,那岂不是挂了。即便是long型也不行,因为long型终归有长度。
回复 使用道具 举报
以字符串的形式传过去
int num=sc.nextInt();//这个代码传进去的是整数,自动过滤最前面的0
用String str=sc.next();

        public static void main(String[] args) {
                Scanner sc=new Scanner(System.in);
                String str=sc.next();
                StringBuilder sb=new StringBuilder();
        char [] arr ={'零','一','二','三','四','五',
                '六','七','八','九'};
                for(int i=0;i<str.length();i++){
                        int index=Integer.parseInt(str.charAt(i)+"");
                        sb.append(arr[index]);
                }
                System.out.println(sb.toString());

        }

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1

查看全部评分

回复 使用道具 举报
vaqh 中级黑马 2014-7-26 08:26:36
11#
振飞 发表于 2014-7-25 22:04
我还是没看到那 所以不会那个方法!!

StringBuffer 类里面有个reverse()方法,可以将字符串逆序排列
回复 使用道具 举报
cat73 黑马帝 2014-7-26 13:30:46
12#
输入时就用next函数而不是nextInt 然后就好做了
回复 使用道具 举报
这个问题考虑的问题重点应该是读取数字的每一位,其他的都是配菜
回复 使用道具 举报
我的做法。是通过map集合。写入0-9字符串,对应0-9.
回复 使用道具 举报
import java.util.Scanner;  public class ZhuanXing {         public static void main(String[] args) {                 char[] ch = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' };                 Scanner sc = new Scanner(System.in);                 System.out.println("请输入数字:");                 String x = sc.nextLine();                 char[] ch2 = x.toCharArray();                 StringBuffer s = new StringBuffer();                 for (int i = 0; i < ch2.length; i++) {                         s.append(ch[ch2[i]-48]);                 }                 System.out.println(s.toString());          } }
回复 使用道具 举报
import java.util.Scanner;

public class ZhuanXing {
        public static void main(String[] args) {
                char[] ch = { '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' };
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入数字:");
                String x = sc.nextLine();
                char[] ch2 = x.toCharArray();
                StringBuffer s = new StringBuffer();
                for (int i = 0; i < ch2.length; i++) {
                        s.append(ch[ch2[i]-48]);
                }
                System.out.println(s.toString());

        }
}

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1

查看全部评分

回复 使用道具 举报
二楼正解,其实可以把string的方法多看一下,查查api里面很多鸡肋方法就能处理这个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马