洛谷P1010 Java解法

题目出处点这里
在这里插入图片描述思路:使用递归
例如对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);
		}
	}

}

**

猜你喜欢

转载自blog.csdn.net/TXXERIN/article/details/107268995
今日推荐