zoukankan      html  css  js  c++  java
  • 天平称重【三进制巧解】

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

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

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

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            List<String> list = f(n);
            Collections.reverse(list);
            
    //        for(String x : list) {
    //            System.out.print(x + " ");
    //        }
            
            int[] a = new int[5];
            a[4] = 81;
            a[3] = 27;
            a[2] = 9;
            a[1] = 3;
            a[0] = 1;
            
            for(int i = list.size() - 1; i >= 0; i --) {
                int temp = a[i] * Integer.parseInt(list.get(list.size() - 1 - i));  //如果是正,除了第一位,其他都要显示正号
                if(temp > 0 && i == list.size() - 1) {                                //第一位不可能为负,所以不用考虑
                    System.out.print(temp);
                }
                else if(temp > 0 && i != list.size() - 1) {
                    System.out.print("+" + temp);
                }
                else if(temp < 0){
                    System.out.print(temp);
                }
                else {
                    //temp == 0;
                }
            }
        }
        private static List<String> f(int n) {
            List<String> list = new ArrayList<String>();
            while(n != 0) {
                int mod = n % 3;
                if(mod != 2) {
                    list.add(String.valueOf(mod));
                    n /= 3;
                }
                else {
                    list.add("-1");
                    n = (n + 1) / 3;
                }
            }
            return list;
        }
    }

     另一份代码:

    // 天平称重,进制解法
    public class B
    {
        static String f(int n){
            String s = "";
            
            int q = 1; //位权重
            while(n>0){
                int sh = n/3; //
                if(n%3 == 1) s = "+" + q + s;
                if(n%3 == 2){
                    sh++;
                    s = "-" + q + s;
                }
                
                n = sh;
                q *= 3;
            }    
            
            return s.substring(1);
        }
            
        public static void main(String[] args){
            for(int i=1; i<100; i++){
                System.out.println(i + ": " + f(i));
            }
        }
    }
  • 相关阅读:
    互联网、云大数据相关书籍推荐
    育儿、教育书籍推荐
    MySQL客户端工具的选择
    解决Windows10或者其他版本Windows Update报错的问题
    启动Myeclipse报错“Failed to create the Java Virtual Machine”的解决办法
    mysql的日期存储字段比较int,datetime,timestamp区别
    nginx增加ssl服务方法
    mysql导入出现MySQL Error 1153
    mysql忘记密码修改方法
    清空本地ssh记录数据,ssh: connect to host Ip port 22: Connection refused
  • 原文地址:https://www.cnblogs.com/jizhidexiaobai/p/8590122.html
Copyright © 2011-2022 走看看