注意程序输出:+号代表放在左盘,-号放在右盘。
思路:联想二进制枚举,这里显然其实是一种三进制枚举。 这里本质上是选或不选的问题,就是要将砝码放左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。这样成功解决问题。
代码:
1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Scanner; 4 5 public class 天平称重 { 6 7 public static void main(String[] args) { 8 //System.out.println(Integer.toString(1000000, 3)); 9 Scanner scanner = new Scanner(System.in); 10 int N = scanner.nextInt(); 11 // 转成3进制 12 final String x = Integer.toString(N, 3); 13 // 翻转后转成字符数组,方便进行进位操作 14 char []arr = new StringBuilder(x).reverse().toString().toCharArray(); 15 // 容器放处理之后的0 -1 1 16 List<Integer> list = new ArrayList<>(); 17 for (int i = 0; i < arr.length; i++) { 18 if (arr[i]=='2') { 19 list.add(0, -1);// -1插在开头 20 if (i==arr.length-1) { 21 list.add(0, 1);// 最后一个字符,进位 22 }else { 23 ++arr[i+1]; // 否则,对下一个数字加1 24 } 25 }else if (arr[i]==3) { 26 list.add(0, 0); 27 if (i==arr.length-1) { 28 list.add(0, 1); 29 }else { 30 ++arr[i+1]; 31 } 32 }else { 33 // arr[i] - '0' 表达的是字符转数字 34 list.add(0, arr[i] - '0'); // 为0或1的话,直接插入数组开头, 35 } 36 } 37 StringBuilder sb = new StringBuilder(); 38 for (int i = 0; i < list.size(); i++) { 39 if (list.get(i)==1) { 40 sb.append("+").append((int)Math.pow(3, list.size()-i-1)); 41 } 42 if (list.get(i)==-1) { 43 sb.append("-").append((int)Math.pow(3, list.size()-i-1)); 44 } 45 } 46 System.out.println(sb.substring(1)); 47 } 48 49 }
结果: