题目:
用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有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;
}
}