题目描述
何一个正整数都可以用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.csdn.net/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^0System.out.print("2(0)");break;case 2 ://2^1System.out.print("2");break;case 3 ://2^0 + 2^1System.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^0System.out.print("2(0)");break;case 2 ://2^1System.out.print("2");break;case 3 ://2^0 + 2^1System.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);}
}