1. 程式人生 > 實用技巧 >天平稱重,進位制轉換解法

天平稱重,進位制轉換解法

題目:

用天平稱重時,我們希望用盡可能少的砝碼組合稱出儘可能多的重量。
如果只有5個砝碼,重量分別是1,3,9,27,81
則它們可以組合稱出1到121之間任意整數重量(砝碼允許放在左右兩個盤中)。

本題目要求程式設計實現:對使用者給定的重量,給出砝碼組合方案。
例如:
使用者輸入:
5
程式輸出:
9-3-1
使用者輸入:
19
程式輸出:
27-9+1

要求程式輸出的組合總是大數在前小數在後。
可以假設使用者的輸入的數字符合範圍1~121。

思路:

觀察輸出,都是3的多少次方,所以我們可以把輸入的值,轉換成3進位制的數,因為3進位制轉10進位制
每一項都是ai*3^n,就滿足題目的要求了,就比如 4 = 1*(3^1) +1*(3^0) =3+1 ,但是 5 使用除K取餘法時,會餘2,我們不能餘2,
因為,每一項的係數ai都應該為 0 或 1 或 -1,所以在除k取餘,我們只要把餘數2變成-1,就行了。

程式碼:

public class Test2 {
   public static void main(String[] args) {
       String weight = JOptionPane.showInputDialog("請輸入重量");
       balance(weight);
   }
    private static void balance(String w) {
       //n為當前被除數
        int n = Integer.parseInt(w);
        ArrayList<Integer> nums = new ArrayList<>();
        int i = 0;
        while (n != 0){
            nums.add(i,n % 3);
            n = n / 3;
            if (nums.get(i) == 2){
                //替換當前位置的數
                nums.set(i,-1);
                n += 1;
            }
            i++;
        }
        System.out.println(nums);
        for (int j = nums.size() - 1 ; j >= 0; j--){
            if (nums.get(j) < 0 || j == nums.size()-1){
                System.out.print((int)Math.pow(3,j)*nums.get(j));
            } else if (nums.get(j) == 0){

            } else{
                System.out.print("+"+(int)Math.pow(3,j)*nums.get(j));
            }
        }

    }
}