5个砝码
题目描述
用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有 5 个砝码,重量分别是 1,3,9,27,81。则它们可以组合称出 1 到 121 之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
输入描述
输入一个数字 N (1≤N≤121),表示给定的重量。
输出描述
输出一行,为砝码组合方案,要求程序输出的组合总是大数在前小数在后。
输入输出样例
示例
输入
5
输出
9-3-1
运行限制
最大运行时间:1s
最大运行内存: 256M
注释
题目给出 5 个砝码,重量分别是 1,3,9,27,81,从中看出这些数都是3的次幂,化为三进制每一位代表了1,1,1,1,1(81,27,9,3,1)。
本人思路
以题目为例121-5=116化为三进制为1,1,0,2,2而初始值为1,1,1,1,1当做减法相减得0,0,1,-1,-1(这一组数表示5由这样的一组三进制数组成)即9-3-1。还有部分说明在代码里。
本人第一次写代码时将116三进制数用for循环存入数组再进行以下相应操作时,在蓝桥杯上提交时会超时,各位写的时候要注意。以下代码三进制转化的同时,也进行相应字符的入栈,代码效率有所提高,蓝桥杯测试点可以通过
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = 0, n2;
int ternary[] = {1, 1, 1, 1, 1};
int n_ternary = 0;
//以题目为例121-5=116
n2 = 121 - n;
//x代表了1,0,-1中的一个
String x = "";
//栈是先进后出,咱for循环是倒着的,最后还要去掉多余的"+"
//以本人现在的经验觉得用栈输出比较好
Stack<String> stack = new Stack<>();
for (int i = ternary.length - 1; i >= 0; i--) {
n_ternary = n2 % 3;
n2 = n2 / 3;
//以上是将116转化为三进制数( n_ternary代表了116三进制数最右边的一位)
//x代表了1,0,-1中的一个
x = String.valueOf(ternary[i] - n_ternary);
if (!x.equals("0")) {
if (x.equals("-1")) {
stack.push(String.valueOf((int) Math.pow(3, 4 - i)));
stack.push("-");
} else {
stack.push(String.valueOf((int) Math.pow(3, 4 - i)));
stack.push("+");
}
}
}
//设置标志,删除开头多余的"+"
int flag = 0;
while (!stack.empty()) {
if (flag == 0 && stack.pop().equals("+")) {
flag = 1;
}
System.out.print(stack.pop());
}
}
}
欢迎大家与我交流,共同进步