问题描述
任何一个正整数都可以用2的幂次方表示。例如:
137=27+23+20
同时约定方次用括号来表示,即ab 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 22+2+20 (21用2表示)
3=2+20
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=210 +28 +25 +2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
输入包含一个正整数N(N<=20000),为要求分解的整数。
输出格式
程序输出包含一行字符串,为符合约定的n的0,2表示(在表示中不能有空格)
任何一个正整数都可以用2的幂次方表示。例如:
137=27+23+20
同时约定方次用括号来表示,即ab 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 22+2+20 (21用2表示)
3=2+20
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=210 +28 +25 +2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
输入包含一个正整数N(N<=20000),为要求分解的整数。
输出格式
程序输出包含一行字符串,为符合约定的n的0,2表示(在表示中不能有空格)
import java.util.*;
public class Main8 {
public static int N;
public static String[] str = { "0", "", "2" };
public static int[] arrays = new int[15];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
System.out.println(make(N));
}
// 0<=n<=2
public static String makeSt(int n) {
switch (n) {
case 2:
return str[2];
case 1:
return str[1];
case 0:
return str[0];
}
return null;
}
// 根据传进来的数字进行转化为2进制,递归调用
public static String make(int n) {
if (n <= 2) {
return makeSt(n);
} else {
String str = "";
int tmp = n, index = 0;
int[] yu = new int[15];
// 化为二进制
while (tmp != 0) {
yu[index++] = tmp % 2;
tmp = tmp / 2;
}
// 查询二进制不为0的位置,
for (int i = index - 1; i >= 0; i--) {
// 当该位置不为0
if (yu[i] != 0) {
// 把指数当参数传入递归函数
if (i == 1) { // 当指数为1时,用2表示
str += 2 + "+" + make(i);
} else
// 指数不为1的使用,用(指数)表示
str += "2(" + make(i) + ")+";
}
}
return str.substring(0, str.length() - 1);
}
}
}