题:任何一个正整数都可以用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
- 题:任何一个正整数都可以用2进制表示
- 一个正整数用16进制表示
- 用Coldfusion实现:任何一个正整数都可以用2的幂次方表示式
- 任何一个正整数都可以用2的幂次方表示,转化
- 任何一个正整数都可以用2的幂次方表示
- 哥德巴赫猜想: 任何一个大于2的偶数都可以拆分为两个素数的和
- C#让任何一个控件都可以全屏播放
- 任何一个偶数都可以分成两个质数和
- 任何时间,都可以开始
- javascript语句可以通过使用8进制表示执行
- C字符用16进制表示
- 进制表示
- 一个正整数有可能可以表示为n(n>=2)个连续的正整数之和,如:15=1+2+3+4+5,15=4+5+6,15=7+8 请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
- 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决
- zoj 1078//用不同的进制表示一个数…
- 允许任何位置都可以打开应用
- 导师作业:2、编写一个函数,将一个整数值转换为16进制表示的字符串。
- 任何时代都需要创客,人人都可以是创客
- 模板代码白话版
- 【心情】CF
- JDBC之全面解析
- Android Studio之入门了解
- java知识点杂货铺【四】
- 题:任何一个正整数都可以用2进制表示
- poj 1823 hotel(线段树)
- HT36ValidSudoku
- Java 生产者 与 消费者 的实际运用
- u-boot-2016.09 make编译过程分析(二)
- 【Thinking in Java】访问权限控制
- Programming In Scala笔记-第十五章、Case Classes和模式匹配
- 数据库
- androdi之自定义控件(一)