蓝桥杯试题 算法训练 幂方分解
任何一个正整数都可以用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),为要求分解的整数。
package 算法训练;
import java.util.Scanner;
public class 幂方分解 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=3;
fun(n);
// 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
// 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
}
static void fun(int n) {
if (n==1) {
System.out.print("2(0)");
return;
}
if (n==2) {
System.out.print(2);
return;
}
for (int i = 0; i <=Math.sqrt(n)+1&&n!=1; i++) {
if (Math.pow(2, i)>=n) {
int num=Math.pow(2, i)==n?i:i-1;
if (num>=2) {
System.out.print("2(");
fun(num);
// System.out.println("---"+num+"---");
System.out.print(")");
}
if (num==1) {
System.out.print("2");
}
n-=Math.pow(2, num);
if (n>=2) //当一个值可以被拆分成多段时,就靠这个条件来插入“+”号
System.out.print("+");
}
i=1;
}
}
if (n==1) {//当当前值剩余1的时候要在屁股加"+2(0)"
System.out.print("+2(0)");
}
}
}
PS:花了我两个多小时… 淦!