黑马程序员技术交流社区

标题: 希望帮忙优化下!! [打印本页]

作者: 振飞    时间: 2014-7-25 21:31
标题: 希望帮忙优化下!!
本帖最后由 振飞 于 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);

        }
}



作者: vaqh    时间: 2014-7-25 21:57
do
                {
                arr1[x]=num%10;
                num/=10;
   这里少了什么东西吧,我觉得你写得太复杂了,我说说我的思路吧,你先定义一个stringbuffer,然后用输入的整数去除10,根据其余数在stringbuffer加入对应的大写数字,然后在调用stringbuffer的reverse方法就可以得到结果了
作者: 依然超级赛亚人    时间: 2014-7-25 21:59
本帖最后由 依然超级赛亚人 于 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);

        }
}

作者: 振飞    时间: 2014-7-25 22:04
vaqh 发表于 2014-7-25 21:57
do
                {
                arr1[x]=num%10;

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

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

陷阱1:不能用算术运算的方法来做,如a/=10,因为你输入的可能是001245,前面是0,你就挂了。
陷阱2:int型,如果输入的数字超过了int型的极限,那岂不是挂了。即便是long型也不行,因为long型终归有长度。
作者: cheye0207    时间: 2014-7-26 04:10
以字符串的形式传过去
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());

        }
作者: vaqh    时间: 2014-7-26 08:26
振飞 发表于 2014-7-25 22:04
我还是没看到那 所以不会那个方法!!

StringBuffer 类里面有个reverse()方法,可以将字符串逆序排列
作者: cat73    时间: 2014-7-26 13:30
输入时就用next函数而不是nextInt 然后就好做了
作者: shen7518    时间: 2014-7-26 14:07
这个问题考虑的问题重点应该是读取数字的每一位,其他的都是配菜
作者: masai158    时间: 2014-8-3 10:10
我的做法。是通过map集合。写入0-9字符串,对应0-9.
作者: 暗影    时间: 2014-8-3 13:50
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());          } }
作者: 暗影    时间: 2014-8-3 13:52
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());

        }
}
作者: likeermei    时间: 2014-8-3 14:16
二楼正解,其实可以把string的方法多看一下,查查api里面很多鸡肋方法就能处理这个




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