题目描述
何一个正整数都可以用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 (21用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+2^0
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入:正整数(n≤20000)
输出:符合约定的n的0,2表示(在表示中不能有空格)
输入格式
一个正整数
输出格式
符合约定的n的0,2表示(在表示中不能有空格)
样例输入
73
样例输出
2(2(2)+2)+2(2+2(0))+2(0)
算法分析
参考博文:https://blog.youkuaiyun.com/C20190413/article/details/72625704
为了寻找规律,我们先列举出1~9的幂次方。
1 2(0)
2 2
3 2(0)+2
4 2(2)
5 2(2)+2(0)
6 2(1)+2(2)
7 2(0)+2+2(2)
8 2(3)=>2(2(0)+2)
9 2(0)+2(3)=>2(2(0)+2)+2(0)
我们不难发现,这其实是一个递归的过程,可以把1,2,3,4作为原子解,从5之后的整数就可以递归求解,如果指数不能用2(0),2,2(2)表示则继续递归分解。
递归模型:
程序实现
public class power {
public static int mypower(int x){
if(x <= 4){
switch(x){
case 0 :
break;
case 1 ://2^0
System.out.print("2(0)");
break;
case 2 ://2^1
System.out.print("2");
break;
case 3 ://2^0 + 2^1
System.out.print("2(0)+2");
break;
case 4 ://2(2)
System.out.print("2(2)");
break;
default :
break;
}
}else {
int i = 1;
for(;Math.pow(2,i)<=x;i++);
System.out.print("2(");
mypower(i - 1);
System.out.print(")");
if (x != Math.pow(2, i - 1))
System.out.print("+");
mypower(x - (int) Math.pow(2, i - 1));
}
return 0;
}
}
运行结果
附:程序源码
import java.util.Scanner;
public class power {
public static int mypower(int x){
if(x <= 4){
switch(x){
case 0 :
break;
case 1 ://2^0
System.out.print("2(0)");
break;
case 2 ://2^1
System.out.print("2");
break;
case 3 ://2^0 + 2^1
System.out.print("2(0)+2");
break;
case 4 ://2(2)
System.out.print("2(2)");
break;
default :
break;
}
}else {
int i = 1;
for(;Math.pow(2,i)<=x;i++);
System.out.print("2(");
mypower(i - 1);
System.out.print(")");
if (x != Math.pow(2, i - 1))
System.out.print("+");
mypower(x - (int) Math.pow(2, i - 1));
}
return 0;
}
}
public class MyPow {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
power.mypower(x);
}
}