用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有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));
}
}
}