1. 天平称重
用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81
则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1
要求程序输出的组合总是大数在前小数在后。
可以假设用户的输入的数字符合范围1~121。
2.题目分析
1.砝码重量都是三的次方,故先转为3进制数
2.由于每个砝码只有一个,故当有为2的数时,可将本位变为-1,然后前一位+1。
3.遍历所有的位,使得没有哪一位的值为2.
3.代码如下
package test; import java.util.*; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern;; public class Test4 { public static void main(String[] args) { Scanner is=new Scanner(System.in); while(is.hasNextInt()) { int n=is.nextInt(); ArrayList<Integer> arr=new ArrayList<>(); char[] nums=Integer.toString(n,3).toCharArray(); for(int i=nums.length-1;i>=0;i--) { if(nums[i]<'2') arr.add(nums[i]-'0'); else { arr.add(-1); if(i==0) {arr.add(1);} else nums[i-1]+=1; } } StringBuilder sb=new StringBuilder(); for(int i=arr.size()-1;i>=0;i--) { if(arr.get(i)>0) if(i==arr.size()-1) sb.append((int)Math.pow(3, i)); else sb.append("+"+(int)Math.pow(3, i)); if(arr.get(i)<0) sb.append("-"+(int)Math.pow(3, i)); } System.out.println(sb.toString()); } is.close(); } }