题目出处点这里
思路:使用递归
例如对1315进行转化:1315 = 210 + (1315 - 210)
就像这样1315可以转化为210和(1315 - 210)两部分
因此问题变成先转化210再转化剩下的(1315 - 210)两大步骤
于是代码可以写成:先递归转化前一为2的k次幂的部分,再递归转化后一部分
**
代码有讲解:
package reintroduction_recursion;
import java.util.Scanner;
public class P1010 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if (n == 1) {
System.out.print("2(0)");
}
if (n == 2) {
System.out.print("2");
}
if (n == 3) {
System.out.print("2+2(0)");
}
if (n > 3) {
j(n);
}
}
public static void j(int n) {
if (n <= 3) {
return;
}
int power = 0;// 存储当前数字可以接受的最大次幂
int start = 2;
while (n >= start) {
start = start * 2;
power++;
}
n = n - start / 2;// 剩下需要转化的数
System.out.print("2(");// 首先输出"2("
// 如果最大次幂等于1、2、3就直接输出对应转化后的值
if (power == 1) {
System.out.print("2(0)");
} else if (power == 2) {
System.out.print("2");
} else if (power == 3) {
System.out.print("2+2(0)");
} else if (power > 3) {
j(power);// 如果不等于1、2、3且大于3就代表还可以化简
}
System.out.print(")");// 第一部分转化完毕,输出"("
// 接下来转化剩下的部分n
// 如果剩下的部分等于1、2、3直接输出转化后的值,注意带上"+"
if (n == 1) {
System.out.print("+2(0)");
} else if (n == 2) {
System.out.print("+2");
} else if (n == 3) {
System.out.print("+2+2(0)");
} else if(n > 3){
// 如果剩下部分的值不等于1、2、3且大于3,那么先加上"+",再继续递归转化剩下部分
System.out.print("+");
j(n);
}
}
}
**