用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81
则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1
要求程序输出的组合总是大数在前小数在后。
可以假设用户的输入的数字符合范围1~121。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); StringBuilder sb = new StringBuilder(); //-1表示在左盘,0表示不放,1表示在右盘 for(int a = -1; a <= 1; a ++) { for(int b = -1; b <= 1; b ++) { for(int c = -1; c <= 1; c ++) { for(int d = -1; d <= 1; d ++) { for(int e = -1; e <= 1; e ++) { if(81 * a + 27 * b + 9 * c + 3 * d + 1 * e == n) { int[] x = new int[5]; int[] y = new int[5]; x[0] = a; x[1] = b; x[2] = c; x[3] = d; x[4] = e; y[0] = 81; y[1] = 27; y[2] = 9; y[3] = 3; y[4] = 1; for(int i = 0; i <= 4; i ++) { if(x[i] == -1) sb.append(y[i] * x[i]); else if(x[i] == 1 && sb.length() != 0) //如果StringBuilder有,即非首项 sb.append("+" + y[i] * x[i]); //首项要加正号 else if(x[i] == 1 && sb.length() == 0) //如果StringBuilder内还没有,即首项 sb.append(y[i] * x[i]); else continue; } } } } } } } System.out.println(sb); } }