天平称重【三进制巧解】

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

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

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        List<String> list = f(n);
        Collections.reverse(list);
        
//        for(String x : list) {
//            System.out.print(x + " ");
//        }
        
        int[] a = new int[5];
        a[4] = 81;
        a[3] = 27;
        a[2] = 9;
        a[1] = 3;
        a[0] = 1;
        
        for(int i = list.size() - 1; i >= 0; i --) {
            int temp = a[i] * Integer.parseInt(list.get(list.size() - 1 - i));  //如果是正,除了第一位,其他都要显示正号
            if(temp > 0 && i == list.size() - 1) {                                //第一位不可能为负,所以不用考虑
                System.out.print(temp);
            }
            else if(temp > 0 && i != list.size() - 1) {
                System.out.print("+" + temp);
            }
            else if(temp < 0){
                System.out.print(temp);
            }
            else {
                //temp == 0;
            }
        }
    }
    private static List<String> f(int n) {
        List<String> list = new ArrayList<String>();
        while(n != 0) {
            int mod = n % 3;
            if(mod != 2) {
                list.add(String.valueOf(mod));
                n /= 3;
            }
            else {
                list.add("-1");
                n = (n + 1) / 3;
            }
        }
        return list;
    }
}

 另一份代码:

// 天平称重,进制解法
public class B
{
    static String f(int n){
        String s = "";
        
        int q = 1; //位权重
        while(n>0){
            int sh = n/3; //
            if(n%3 == 1) s = "+" + q + s;
            if(n%3 == 2){
                sh++;
                s = "-" + q + s;
            }
            
            n = sh;
            q *= 3;
        }    
        
        return s.substring(1);
    }
        
    public static void main(String[] args){
        for(int i=1; i<100; i++){
            System.out.println(i + ": " + f(i));
        }
    }
}
原文地址:https://www.cnblogs.com/jizhidexiaobai/p/8590122.html