蓝桥杯训练 ——天平称重

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();
    }

}

 

posted @ 2018-03-22 11:01  即便那总是过去  阅读(748)  评论(0编辑  收藏  举报