蓝桥杯:砝码称重

用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81
则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。

本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1

要求程序输出的组合总是大数在前小数在后。
可以假设用户的输入的数字符合范围1~121。

package four;

import java.util.Scanner;

/*
 * 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
	如果只有5个砝码,重量分别是1,3,9,27,81
	则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
	
	本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
	例如:
	用户输入:
	5
	程序输出:
	9-3-1
	用户输入:
	19
	程序输出:
	27-9+1
	
	要求程序输出的组合总是大数在前小数在后。
	可以假设用户的输入的数字符合范围1~121。

 */
/*
 * 思路:genuine观察发现,当X大于3的n次方的二分之一时,需要做减法;当x小鱼3的n次方的二分之一时,做加法,如此就找到了递归的相似性。
 */
public class tianping_2 {
	//该方法吧字符串中的+和—反转,因为在做减法时要变号。
	
	static String reve(String s){
		s=s.replace('-', '#');
		s=s.replace('+', '-');
		s=s.replace('#','+');
		//因为是要做减法,所以要在前边加上'-'
		return "-"+s;
	}
	static String fun(int x){
		int a=1;
		//寻找正好比x大的那个砝码重量。
		while(a<x){
			a=a*3;
		}
		//如果砝码重量正好等于要称重的数字,直接输出砝码重量
		if(x==a)  return ""+a;
		//如果称重数字小于等于砝码重量的二分之一,做加法。
		if(x<=a/2)  return ""+a/3+"+"+fun(x-a/3); 
		//如果称重数字大于砝码重量的二分之一,做减法,并且对递归的字符串做符号反转。
		return a+reve(fun(a-x));
		
	}
	@SuppressWarnings("resource")
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while(true){
			int n=sc.nextInt();
			System.out.println(fun(n));
		}
		

	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值