问题描述
任何一个正整数都可以用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表示(在表示中不能有空格)
解题思路:
要想分解某个数,例如n = 137,可以先算出不超过n的最大的2的幂方数,这里2的七次方为128,所以此时便将n分解成了两部分,128和另一部分9,而7又可以再分解成2的二次和3,分解到指数是2时,意味着不用再继续分解,即到达了递归出口。
java代码:
import java.io.*;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
Rec12 obj = new Rec12(n);
System.out.println(obj.ans);
}
}
class Rec12 {
int n;
StringBuilder ans = new StringBuilder();//存放结果
int[] arr = new int[] { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384 };//打表
public Rec12(int n) {
this.n = n;
rec(n);
}
public void rec(int n) {
if(n == 0) return;
if (n == 1) {
ans.append("2(0)");
return;
}else if(n == 2) {
ans.append("2");
return;
}//递归出口
ans.append("2");//添加底数
int index = 14;//不超过n的2的最大次幂
while(arr[index] > n) {
index--;
}
if(index > 1) {//只有索引大于1(2的一次方等于2,不用再往下分解)时,才需要继续分解
ans.append("(");
rec(index);
ans.append(")");
}
n -= arr[index];//分解另一部分
if(n > 0) ans.append("+");//只有另一部分比0大时,分解才有意义
rec(n);
}
}
提交截图: