【蓝桥java】进制与整除之天平秤重

题目:

用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81
则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。

本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1

要求程序输出的组合总是大数在前小数在后。
可以假设用户的输入的数字符合范围1~121。

方法一:

代码实现:

package cn.zzunit.jnvi;
/**
 * 
 * @author tyrantForever
 */
public class Project1 {

	//输入一个方程将其加号变为减号 减号变为加号
	public static void main(String[] args) {
		for(int i = 1; i < 10; i++) {
			System.out.println(findMethord(i));
		}
	}
	
	//输入的为需要将加减号对调的方程
	public static String reverse(String equation) {
		equation = equation.replace("+", "#");
		equation = equation.replace("-", "+");
		equation = equation.replace("#", "-");
		return equation;
		
	} 
	
	public static String findMethord(int weight) {
		int counterWeight = 1;
		while(weight > counterWeight) {
			counterWeight *= 3;
		}
		if (weight == counterWeight) {
			//注意:此处有一个int转成String 的方法
			return counterWeight + "";
		}
		if(weight <= counterWeight / 2) {
			//问题:在这里怎么实现显示出counterWeigh的值
			return Integer.toString(counterWeight / 3 ) + "+" + findMethord(weight - counterWeight / 3);
		}else {
			return Integer.toString(counterWeight) + "-" + reverse(findMethord(counterWeight - weight)); 
		}
	}

}

注:

(1)将int类型数据转为String类型的数据可以直接再int类型的数据之后拼接一个空串

(2)reverse函数的目的是实现一个方程中的“+”变“-” “-”变“+” 但是不能直接变而是借助了一个中间变量“#”,否则先将+ 变成了-然后又将- 变成了 + 最后全是+

(3)注意replace()和replaceAll()的区别 replace不支持正则表达式,replaceAll支持

方法二:

使用进制的方法

思路:

砝码都是3的倍数,类似于将一个数转换成三进制,但是不同的是三进制的余数为:0、1、2,但是本题将余数改为:-1、0、1

所以在使用除三取余的方法时规则出现了改变

如:使用除三取余的方法分解5

注:将 2改为-1 ,方法就是将商商大一点自然余数就是负的

代码实现:

package cn.zzunit.jnvi;
/**
 * 
 * @author tyrantForever
 *
 */

public class Project1_2 {

	public static void main(String[] args) {
		for(int i = 1; i < 10; i++) {
			System.out.println(	i + " = " + findMethord(i));
		}
	}
	
	public static String findMethord(int weight) {
		//代表权重
		int qrvs = 1;
		//代表商
		int uh = weight;
		//代表余数
		int yuuu = 1;
		//公式的字符串
		String formula = "";
		while(uh > 0) {
			yuuu = uh % 3;
			
			if(yuuu == 1) {
				formula = "+" + qrvs + formula;
			}
			if(yuuu == 2) {
				uh = uh + 1;
				formula = "-" + qrvs + formula;
			}
			uh = uh / 3;
			qrvs *= 3;
		}
		formula = formula.substring(1);
		
		return formula;
	}

}

猜你喜欢

转载自blog.csdn.net/tyrant_forever/article/details/104703886