题:任何一个正整数都可以用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("+"); } } } } } }
相关文章推荐
- 一个正整数有可能可以表示为n(n>=2)个连续的正整数之和,如:15=1+2+3+4+5,15=4+5+6,15=7+8 请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
- 任何一个正整数都可以用2的幂次方表示,转化
- 用Coldfusion实现:任何一个正整数都可以用2的幂次方表示式
- 任何一个正整数都可以用2的幂次方表示
- 有理循环小数 1/7 = 0.142857142... 是个无限循环小数。 任何有理数都可以表示为无限循环小数的形式。 本题目要求即是:给出一个数字的循环小数表示法。
- 对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。
- 整数输入有理循环小数 1/7 = 0.142857142... 是个无限循环小数。 任何有理数都可以表示为无限循环小数的形式。 本题目要求即是:给出一个数字的循环小数表示法。
- 问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。 输入格式 输入一个正整数N。 输出格式 输出一个整数,表示你找到的最小公倍数。 样例输入 9 样例输出 5
- 如何判断一个整数x是否可以表示成n个连续正整数的和
- 一个有序正整数集S,若要保证整数集中所有的数通过组合(相加)可以表示1~N中任意一个正整数
- 求解一个正整数有可能可以被表示为 n个连续正整数之和
- 验证歌德巴赫猜想:任何一个充分大的偶数都可以表示为两个素数之和。请输入一个偶数,将其表示成两个素数之和。
- C++初学者之根据输入的任何一个正整数,输出可能被表示的连续正整数
- 一个正整数有可能可以被表示为 m(m>=2) 个连续正整数之和,编写一个程序,输入一个正整数,然后找出符合这种要求的所有 连续正整数序列,若不存在这种序列,则打印None。
- 每天一到算法练习题1 -- 一个正整数有可能可以被表示为 n(>=2) 个连续正整数之和
- 一个正整数有可能可以被表示为M(M>2)个连续正整数之和。
- 你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的
- 一个正整数有可能可以被表示为 n(n>2)个连续正整数之和(C++上机考试题1)
- 1/7 = 0.142857142... 是个无限循环小数。 任何有理数都可以表示为无限循环小数的形式。 本题目要求即是:给出一个数字的循环小数表示法。 例如: 输入: 1,5 则输出: 0.2 输入
- 判断一个整数x是否可以表示成n(n>=2)个连续正整数的和