进制均值(京东2017秋招真题)

来源:互联网 发布:hp g3110扫描仪软件 编辑:程序博客网 时间:2024/05/17 05:50

  • 题目描述
    • 输入
    • 输出
    • 时间限制
  • 分析
  • AC 代码 Java

题目描述

尽管是一个CS专业的学生,小B的数学基础很好并对数值计算有着特别的兴趣,喜欢用计算机程序来解决数学问题。现在,她正在玩一个数值变换的游戏。她发现计算机中经常用不同的进制表示同一个数,如十进制数123表达为16进制时只包含两位数7、11(B),用八进制表示时为三位数1、7、3。按不同进制表达时,各个位数的和也不同,如上述例子中十六进制和八进制中各位数的和分别是18和11。

小B感兴趣的是,一个数A如果按2到A-1进制表达时,各个位数之和的均值是多少?她希望你能帮她解决这个问题?

所有的计算均基于十进制进行,结果也用十进制表示为不可约简的分数形式。

输入

输入中有多组测试数据。每组测试数据为一个整数A(1=<A=<5000)。
样例输入
5
3

输出

对每组测试数据,在单独的行中以X/Y的形式输出结果。
样例输出
7/3
2/1

时间限制

C/C++语言:1000MS其它语言:3000MS
内存限制
C/C++语言:65536KB其它语言:589824KB

分析

题目最后要求 【结果也用十进制表示为不可约简的分数形式】, 这个其实在解体的过程中没有理解意思, 就是需要 sum/ (n-2) 是约分到最简形式, 需要分子分母同时除以 sum 和 (n-2) 的最大公约数。

AC 代码 Java

import java.util.Scanner;public class Main {    public static void main(String[] args){        Scanner sc  = new Scanner(System.in);        while(sc.hasNext()){            int num = sc.nextInt();            int sum = calculate(num);            //分子分母同时除以最大公约数, 化成最简形式            System.out.printf("%d/%d\n", sum/ maxGongyueShu(sum, num-2), (num-2)/maxGongyueShu(sum, num-2));        }    }    //求解两个数的最大公约数    public static int maxGongyueShu(int a, int b){        int temp = 0;        if(a < b){            temp = a;            a = b;            b = temp;        }        int c = a % b;        if(c == 0){            return b;        }else{            return maxGongyueShu(b, c);        }    }    //对每个数的 2 到 n-1 进制的位数进行就和    public static int calculate(int n){        int jinZhi = n-1;        int sum = 0;        while(jinZhi>1){            sum += averageA(jinZhi, n );            jinZhi--;        }        return sum;    }    //对一个数的某一进制的数字进行求和    public static int averageA(int jinZhi, int n){        int sumOfN = 0;        while(n>0){            sumOfN += (n %jinZhi);            n = n/jinZhi;        }        return sumOfN;    }}

输入:

531000927260131386277766

输出:

7/32/190132/499155449/9256265/1293370/129857/122864/55
原创粉丝点击