砝码称重

/*砝码称重 
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值