美文网首页
OJ练习1 --- 进制均值

OJ练习1 --- 进制均值

作者: 梦蓝樱飞2020 | 来源:发表于2017-11-30 16:32 被阅读16次

    问题:
    求一个数A如果按2到A-1进制表达时, 各个位数之和的均值是多少?

    输入:
    输入中有多组测试数据, 每组测试数据为一个整数(A在[1, 5000]内)
    输出:
    对每组测试数据, 在单独的行中以X/Y的形式表达.

    样例输入
    5
    3
    样例输出
    7/3
    2/1

    分析:
    均值即平均值, 数字5在二进制下, 变为101, 3进制下为12, 4进制下为11, 故结果为7/3.
    e.g.
    255(10), n是数字, a是进制数, 255%10为个位数5, 即通过取余和移位的方法, 可以求得该数字在几进制下的所有位数之和, 再通过循环取得从2到A-1进制下的总和即可.

    代码示例以及注释:

    package nowcoder.a1_Jingdong;
    
    import java.util.Scanner;
    
    /**
     * 进制均值
     *
     * @Author menglanyingfei
     * @Created on 2017.11.29 15:24
     */
    public class T1_hexSum {
    
        public static void main(String[] args) {
            int A;
    
            Scanner sc = new Scanner(System.in);
            while ((A = sc.nextInt()) != 0) {
                int sum = 0;
    
                for (int i = 2; i <= A - 1; i++) {
                    sum += hexSum(A, i);
                }
    
                int r = gcd(sum, A-2);
                System.out.println((sum / r) + "/" + (A-2) / r);
            }
            
        }
    
        // 求一个进制数的所有位数之和, n是数字, a是进制数
        public static int hexSum(int n, int a) {
            int sum = 0;
            while (n != 0) {
                sum += (n % a);
                n = n / a;
            }
    
            return sum;
        }
        /*
    
        实现gcd比较好用的是辗转相除法
        比如:49和91
         a      b        temp
        49  %  91  =  49
        91  %  49  =  42
        49  %  42  =  7
        42  %  7    =  0
        所以最大公约数就是7.
        (看懂这, 下面的代码, 你肯定懂的!)
         */
        // 求最大公约数(辗转相除法)
        private static int gcd(int sum, int i) {
           while (i != 0) {
               int temp = sum % i;
               sum = i;
               i = temp;
           }
           return sum;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:OJ练习1 --- 进制均值

          本文链接:https://www.haomeiwen.com/subject/ikgvbxtx.html