题目: 天平称重
用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81
则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1
解题思路:可以用三进制解决,三进制上每一位都对应着一个砝码。但是需要注意的是题目中的每一种砝码都只有一个。三进制中却是会出现2的。所以需要对三进制进行改变;大体思想为:右边加两个砝码变成左边加一个右边加一个。也就是说加两个砝码相当于加一个大的再减去一个小的。在数字上的体现就是:将2变成-1更高位上进1。
代码如下:
import java.util.*;
public class 天平称重问题 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
svole(n);
}
private static void svole(int n) {
String str = Integer.toString(n, 3);
//翻转后转换为字符数组
char[] arr = new StringBuilder(str).reverse().toString().toCharArray();
Stack<Integer> stack = new Stack();
for(int i=0; i<arr.length; i++){
if(arr[i] == '2'){
stack.add(-1);
if(i==arr.length-1){
stack.add(1);
}else
++arr[i+1];
}
else if(arr[i] == '3'){
stack.add(0);
if(i==arr.length-1){
stack.add(1);
}else
++arr[i+1];
}
else{
stack.add(arr[i]-'0');
}
}
StringBuilder sb = new StringBuilder();
boolean b = true;
while(stack.size()!=0){
int t = stack.pop();
if(t==1 && b){
sb.append("").append((int)Math.pow(3, stack.size()));
b = false;
}
else if(t==1) sb.append("+").append((int)Math.pow(3, stack.size()));
else if(t==-1) sb.append("-").append((int)Math.pow(3, stack.size()));
}
System.out.println(sb.toString());
}
}