天平稱重,進位制轉換解法
阿新 • • 發佈:2020-08-17
題目:
用天平稱重時,我們希望用盡可能少的砝碼組合稱出儘可能多的重量。
如果只有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)); } } } }