您的位置:首页 > 编程语言 > Java开发

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

2016-10-08 23:24 791 查看

正整数转换成二进制数

问题描述: 任何一个正整数都可以用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("+");
}
}
}

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 进制
相关文章推荐