洛谷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);
		}
	}

}

**

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值