题:任何一个正整数都可以用2进制表示

来源:互联网 发布:人工智能三个阶段 编辑:程序博客网 时间:2024/06/06 00:43

正整数转换成二进制数

问题描述: 任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
  将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0
现在约定幂次用括号来表示,即a^b表示为a(b)
  此时,137可表示为:2(7)+2(3)+2(0)
  进一步:7=2^2+2+2^0 (2^1用2表示)
  3=2+2^0
  所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
  又如:1315=2^10+2^8+2^5+2+1
  所以1315最后可表示为:
  2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

java解题

这是上学时所遇到的一道题,当时 使用的是Integer.toBinaryString转换成二进制

Transform.java

public class Transform {    public static void main(String[] args) {        System.out.print("input a positive integer:");        Scanner scan = new Scanner(System.in);        fun(Integer.toBinaryString(scan.nextInt()));    }    public static void fun(String number) {        for (int i = 0; i < number.length(); i++) {            if (number.charAt(i) == '1') {                if (i == number.length() - 1) {                    System.out.print("2(0)");                } else if (i == number.length() - 2) {                    System.out.print("2");                    if (number.charAt(i + 1) == '1') {                        System.out.print("+");                    }                } else {                    System.out.print("2(");                    fun(Integer.toBinaryString(number.length() - 1 - i));                    System.out.print(")");                    if(number.substring(i+1).contains("1")){                        System.out.print("+");                    }                }            }        }    }}

现在重温该题目,无论使用Integer.toBinaryString和Long.toBinaryString方法都有位数限制,而且运行速率也不相同(Integer.toBinaryString>Long.toBinaryString)。

为了能够无限输入位数,使用字符串输入,然后对字符串进行处理。编写一个方法类:BinaryUtils

BinaryUtils.java

public class BinaryUtils {    public static String toBinary(String number) {        if (null == number || number.isEmpty()) {            return null;        }        int count = number.length();        if (count <= 10 && number.charAt(0) < '2') {            return Integer.toBinaryString(Integer.parseInt(number));        }        if (count <= 19 && number.charAt(0) < '9') {            return Long.toBinaryString(Long.parseLong(number));        }        return toBinary2(number);    }    private static String toBinary2(String number) {        String mTransform = "";        int quot; // 商数        int rem; // 余数        String result = number;        while (!result.isEmpty()) {            number = "";            rem = 0;            for (int i = 0; i < result.length(); i++) {                int base = result.charAt(i) - '0' + rem * 10;                quot = base / 2;                rem = base % 2;                if (number.isEmpty()) {                    if (quot != 0) {                        number += quot;                    }                } else {                    number += quot;                }            }            result = number;            mTransform = rem + mTransform;        }        return mTransform;    }}

则主要程序Transform.java调用BinaryUtils.java中toBinary方法

Transform.java改为

public class Transform {    public static void main(String[] args) {        System.out.print("input a positive integer:");        Scanner scan = new Scanner(System.in);        //fun(Integer.toBinaryString(scan.nextInt()));        fun(BinaryUtils.toBinary(scan.nextLine()));    }    public static void fun(String number) {        for (int i = 0; i < number.length(); i++) {            if (number.charAt(i) == '1') {                if (i == number.length() - 1) {                    System.out.print("2(0)");                } else if (i == number.length() - 2) {                    System.out.print("2");                    if (number.charAt(i + 1) == '1') {                        System.out.print("+");                    }                } else {                    System.out.print("2(");                    fun(Integer.toBinaryString(number.length() - 1 - i));                    System.out.print(")");                    if(number.substring(i+1).contains("1")){                        System.out.print("+");                    }                }            }        }    }}
0 0
原创粉丝点击