第六章 數學問題 -------- 6.1【巧用進位制】天平稱重問題

Curtis_發表於2019-03-21

 注意程式輸出:+號代表放在左盤,-號放在右盤。

1、思路:

       聯想二進位制列舉,這裡顯然其實是一種三進位制列舉。 這裡本質上是選或不選的問題,就是要將砝碼放左or放右即+or-表示式的問題。但是得到的三進位制值是由0 1 2組成,不好準確的表達是選還是不選的問題,於是我們可以想辦法把0 1 2變成1 0 -1。於是我們可以對三進位制數2進行進位操作,然後在減1,這樣就把三進位制全部變成由1 0 -1組成的了。再轉換成十進位制解決問題。

  例如使用者輸入數字5,那麼它的三進製為1 2,現在對2加1減1,得到2 -1,然後在對2加1減1,得到1 -1 -1,這樣再轉換成十進位制為9-3-1。這樣成功解決問題。

2、程式碼:

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

public class 天平稱重 {

    public static void main(String[] args) {
        //System.out.println(Integer.toString(1000000, 3));
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        // 轉成3進位制
        final String x = Integer.toString(N, 3);
        // 翻轉後轉成字元陣列,方便進行進位操作
        char []arr = new StringBuilder(x).reverse().toString().toCharArray();
        // 容器放處理之後的0 -1 1
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            if (arr[i]=='2') {
                list.add(0, -1);// -1插在開頭
                if (i==arr.length-1) {
                    list.add(0, 1);// 最後一個字元,進位
                }else {
                    ++arr[i+1];  // 否則,對下一個數字加1
                }
            }else if (arr[i]==3) {
                list.add(0, 0);
                if (i==arr.length-1) {
                    list.add(0, 1);
                }else {
                    ++arr[i+1];
                }
            }else {
                // arr[i] - '0' 表達的是字元轉數字
                list.add(0, arr[i] - '0'); // 為0或1的話,直接插入陣列開頭,
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i)==1) {
                sb.append("+").append((int)Math.pow(3, list.size()-i-1));
            }
            if (list.get(i)==-1) {
                sb.append("-").append((int)Math.pow(3, list.size()-i-1));
            }
        }
        System.out.println(sb.substring(1));
    }

}

3、結果:

 

 

相關文章