/*砝码称重
5个砝码
用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81。则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1
要求程序输出的组合总是大数在前小数在后。
可以假设用户的输入的数字符合范围1~121。
*/
/*import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;
public class 砝码称重 {
public static int[] a = { 1, 3, 9, 27, 81 };
public static int[] sign = new int[] { -1, 0, 1 }; // 定义符号
public static void f(int n, int start, int end) {
if (start == end) { // 修改完最后一位符号时输出
check(n, a);
} else { // 递归向后修改,数字 变为 数字加符号
for (int i = 0; i < 3; i++) {
int temp = a[start];
a[start] = sign[i] * a[start];
f(n, start + 1, end);
a[start] = temp;
}
}
}
// 验证 并 输出
public static void check(int n, int[] b) {
StringBuffer sb = new StringBuffer();
int sum = 0;
for (int i = 0; i < b.length; i++)
sum = sum + b[i];
if (sum == n) {
for (int i = b.length-1; i >=0; i--)
sb.append(b[i] != 0 ? (b[i] > 0 ? "+" + b[i] : b[i]) : "");
sb.deleteCharAt(0); // 去掉首元素的"+"号;
System.out.println(sb);
return;
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("输入重量(1到121)之间任意整数");
int n = scan.nextInt(); // 输入重量
f(n, 0, a.length);
}
}*/
//方法二:
import java.util.Scanner;
public class 砝码称重 {
public static void f(int n) {
int[] sign = new int[]{-1,0,1}; // 定义符号
StringBuffer sb = new StringBuffer();
for(int a:sign){
for(int b:sign){
for(int c:sign){
for(int d:sign){
for(int e:sign){
int i = a*1;
int j = b*3;
int k = c*9;
int l = d*27;
int m = e*81;
if(i+j+k+l+m==n){ // 找到结果
// 如果不为0,则添加元素,并在"正数"前添加"+"号
sb.append(m!=0?(m>0?"+"+m:m):"");
sb.append(l!=0?(l>0?"+"+l:l):"");
sb.append(k!=0?(k>0?"+"+k:k):"");
sb.append(j!=0?(j>0?"+"+j:j):"");
sb.append(i!=0?(i>0?"+"+i:i):"");
sb.deleteCharAt(0); // 去掉首元素的"+"号;
System.out.println(sb);
return;
}
}
}
}
}
}
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("输入重量(1到121)之间任意整数");
int n = scan.nextInt(); // 输入重量
f(n);
}
}
方法三:
import java.util.Scanner;
public class 砝码称重 {
public static int[] a = { 1, 3, 9, 27, 81 };
public static void f(int n) {
int[] b = new int[a.length];
int len = a.length;
int[] sign = new int[len];
while (sign[0] < 3) { // 最前面的判定符号的值若 >=3 则结束循环
for (int i = 0; i < len; i++) {
if (sign[i] == 1) {
b[i] = a[i];
} else if (sign[i] == 2) {
b[i] = -1 * a[i];
} else
b[i] = 0;
}
check(n, b);
sign[len - 1]++;
for (int i = len - 1; i > 0; i--) { // 当值等于3时,实现逢3进位
if (sign[i] == 3) {
sign[i] = 0; // sign[i] 归零
sign[i - 1]++; // sign[i-1]进位
}
}
}
}
// 验证 并 输出
public static void check(int n, int[] b) {
StringBuffer sb = new StringBuffer();
int sum = 0;
for (int i = 0; i < b.length; i++)
sum = sum + b[i];
if (sum == n) {
for (int i = b.length - 1; i >= 0; i--)
sb.append(b[i] != 0 ? (b[i] > 0 ? "+" + b[i] : b[i]) : "");
sb.deleteCharAt(0); // 去掉首元素的"+"号;
System.out.println(sb);
return;
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("输入重量(1到121)之间任意整数");
int n = scan.nextInt(); // 输入重量
f(n);
}
}
运行结果:
输入重量(1到121)之间任意整数
19
27-9+1
砝码称重
最新推荐文章于 2022-12-18 12:28:58 发布