黑马程序员技术交流社区

标题: 求指正,求分享,关于接受字符串转换成十进制再转换二进制... [打印本页]

作者: 梁古叔广    时间: 2016-10-12 01:44
标题: 求指正,求分享,关于接受字符串转换成十进制再转换二进制...
编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数,然后打印出这个十进制整数对应的二进制形式。
这个程序要考虑输入的字符串不能转换成一个十进制整数的情况,并对转换失败的原因要区分出是数字太大,还是其中包含有非数字字符的情况。

楼主卡在如何判断是否数字太大的位置,结果用比较笨的办法些出来,也不知道有没有问题,求指正,还望各位有好的方法能不吝分享,以下是楼主的本方法代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Test {

        /**
         * 编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数,然后打印出这个十进制整数对应的二进制形式。
         * 这个程序要考虑输入的字符串不能转换成一个十进制整数的情况
         * ,并对转换失败的原因要区分出是数字太大,还是其中包含有非数字字符的情况。
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                ArrayList<Integer> al = new ArrayList<>();
                Scanner sc = new Scanner(System.in);
                System.out.println("输入数据");
               
                String s = sc.nextLine();
                if(!s.matches("[0-9]+")){
                        System.out.println("错误!其中包含非数字字符");
                        return;
                }else if(s.matches("[0](.)+")){
                        System.out.println("错误!以0开头");
                        return;
                }else if(getNum(s)>0){
                        System.out.println("错误!输入数据过大");
                        return;
                }else{
                       
                        int i = Integer.parseInt(s);
                        System.out.println(i);
                        while (i != 0) {
                                al.add(i % 2);
                                i = i / 2;
                        }
                }
                Collections.reverse(al);
                for (Integer in : al) {
                        System.out.print(in);
                }

        }

        private static int getNum(String s) {
                char[] arr1=s.toCharArray();
                char[] arr2 =(Integer.MAX_VALUE+"").toCharArray();
                int num = 0;
                if(arr1.length >arr2.length){
                        num=1;
                }else if(arr1.length<arr2.length){
                        num=-1;
                }else{
                        for (int i = 0; i < arr2.length; i++) {
                                num =arr1[i]-arr2[i];
                                if(num!=0){
                                        break;
                                }
                        }
                }
                return num;
        }

}

作者: 13902480061    时间: 2016-10-12 05:52
getnum方法判断大小可以比较两个字符串大小,十进制转二进制好像有个方法直接用。0开头的字符串转整形头部应该会去掉吧?(没测试过,目测是可以的)

作者: 梁古叔广    时间: 2016-10-12 11:34
13902480061 发表于 2016-10-12 05:52
getnum方法判断大小可以比较两个字符串大小,十进制转二进制好像有个方法直接用。0开头的字符串转整形头部 ...

十转二 我就用的除基数倒取余,不知道直接方法是啥,这个我测试好像是没问题的,但是感觉判断数据是否过大的getNum()方法有点笨,不知道有没有更简单的
作者: 13902480061    时间: 2016-10-12 20:19
梁古叔广 发表于 2016-10-12 11:34
十转二 我就用的除基数倒取余,不知道直接方法是啥,这个我测试好像是没问题的,但是感觉判断数据是否过大的 ...

十进制转成十六进制:
Integer.toHexString(int i)
十进制转成八进制
Integer.toOctalString(int i)
十进制转成二进制
Integer.toBinaryString(int i)
十六进制转成十进制
Integer.valueOf("FFFF",16).toString()
八进制转成十进制
Integer.valueOf("876",8).toString()
二进制转十进制
Integer.valueOf("0101",2).toString()

作者: 梁古叔广    时间: 2016-10-12 20:55
13902480061 发表于 2016-10-12 20:19
十进制转成十六进制:
Integer.toHexString(int i)
十进制转成八进制

谢谢,长知识了....
作者: 一半的留言    时间: 2016-10-12 22:25
[Java] 纯文本查看 复制代码

                /*
                 * 1:键盘录入一个int类型的整数,对其求二进制表现形式
                 * 如果录入的整数过大,给予提示,录入的整数过大请重新录入一个整数(BigInteger)
                 * 如果录入的是小数,给予提示,录入的是小数,请重新录入一个整数(BigDecimal)
                 * 如果录入的是其他字符,给予提示,录入的是非法字符,请重新录入一个整数 注意 推荐使用 字符串的方法
                 */
                Scanner sc = new Scanner(System.in);
                System.out.println(Integer.MAX_VALUE);
                System.out.println("请录入一个int类型的整数,返回二进制表现形式");
                while (true) {
                        String line = sc.nextLine();

                        if (line.matches(".*[\\.].*")) {
                                if (!line.endsWith(".")) {
                                        System.out.println("录入的是小数,请重新录入一个整数");
                                        continue;
                                }

                        }
                        if (line.matches(".*[\\D].*") || line.endsWith(".")) {
                                System.out.println("录入的是非法字符,请重新录入一个整数");
                        } else if ((new BigInteger(line).compareTo(new BigInteger(
                                        Integer.MAX_VALUE + ""))) > 0) {
                                System.out.println("录入的整数过大请重新录入一个整数");
                        } else {
                                String binaryString = Integer.toBinaryString(Integer
                                                .parseInt(line));
                                System.out.println("该数的二进制是:" + binaryString);
                                break;
                        }

                }

       

作者: 梁古叔广    时间: 2016-10-12 23:17
一半的留言 发表于 2016-10-12 22:25
[mw_shl_code=java,true]
                /*
                 * 1:键盘录入一个int类型的整数,对其求二进制表现形式

厉害 word哥,正则用的6666




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