蓝桥杯-java-五个砝码

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());
        }

    }
}


欢迎大家与我交流,共同进步

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值