列表

详情


JD8. 进制均值

描述

尽管是一个CS专业的学生,小B的数学基础很好并对数值计算有着特别的兴趣,喜欢用计算机程序来解决数学问题,现在,她正在玩一个数值变换的游戏。她发现计算机中经常用不同的进制表示一个数,如十进制数 123 表达为 16 进制时只包含两位数 7、11(B),用八进制表示为三位数 1、7、3,按不同进制表达时,各个位数的和也不同,如上述例子中十六进制和八进制中各位数的和分别是 18 和 11 。 小B感兴趣的是,一个数 A 如果按 2 到 A-1 进制表达时,各个位数之和的均值是多少?她希望你能帮她解决这个问题? 所有的计算均基于十进制进行,结果也用十进制表示为不可约简的分数形式。

数据范围:

输入描述

输入中有多组测试数据,每组测试数据为一个整数A

输出描述

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

示例1

输入:

5
3

输出:

7/3
2/1

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 292KB, 提交时间: 2021-12-11

#include <stdio.h>
#include <assert.h>
int gcd(int a, int b)
{
    int remainder = a%b;
    return remainder ? gcd(b, remainder) : b;
}
int main(void)
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        assert(n > 1);
        assert(n <= 5000);
        
        int res = 0;
        for(int i=2; i<n; ++i){
            int num = n;
            while(num)
            {
                res += num%i;
                num /= i;
            }
        }
        int k = gcd(res, n-2);
        printf("%d/%d\n", res/k, (n - 2)/k);
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2020-12-29

#include<stdio.h>
int main(void)
{
    int A,i,A0;
    int sum;
    int count,X,Y;
    while(scanf("%d",&A)!=EOF)
    {
        A0=A;
        count=A0-2;
        sum=0;
        for(i=2;i<A0;i++)
        {
            A=A0;
            while(A!=0)
            {
                sum+=(A%i);
                A/=i;
            }
        }
        for(i=count/2;i>=2;i--)
        {
            if((sum%i==0)&&(count%i==0))
            {
                sum/=i;
                count/=i;
            }
        }
        X=sum;
        Y=count;
        printf("%d/%d\n",X,Y);
        
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2018-12-14

#include <stdio.h>

int main(){
	int A;
	int sum,gcd;
	int i;
	int num;
	int m,n,r;
	
	while(scanf("%d",&A)!=EOF){
	sum=0;
	for(i=2;i<=A-1;i++){
		num=A;
		while(num>0){
			sum=sum+num%i;
			num=num/i;
		}
	}
	
	m=sum;
	n=A-2;
	while(n){
		r=m%n;
		m=n;
		n=r;
	} 
	gcd=m;
	printf("%d/%d\n",sum/gcd,(A-2)/gcd);
	}	
}

C 解法, 执行用时: 2ms, 内存消耗: 364KB, 提交时间: 2018-12-11

#include <stdio.h>

int main(){
	int A;
	int sum,gcd;
	int i;
	int num;
	int m,n,r;
	
	while(scanf("%d",&A)!=EOF){
	sum=0;
	for(i=2;i<=A-1;i++){
		num=A;
		while(num>0){
			sum=sum+num%i;
			num=num/i;
		}
//		printf("%d\n",sum);
	}
	
	m=sum;
	n=A-2;
	while(n){
		r=m%n;
		m=n;
		n=r;
	} 
	gcd=m;
//	printf("%d",sum);
//	printf("%d",m);
	printf("%d/%d\n",sum/gcd,(A-2)/gcd);
	}	
}

C 解法, 执行用时: 2ms, 内存消耗: 384KB, 提交时间: 2019-08-19

#include <stdio.h>

int n,sum;

int gcd(int a,int b);

int main()
{
	int i,t;
	while(scanf("%d",&n)!=EOF)
	{
		sum = 0;
		for(i=2;i^n;i++)
			for(t=n;t;t/=i)
				sum += t % i;
		n -= 2;
		t = gcd(sum,n);
		printf("%d/%d\n",sum/t,n/t);
	}
	return 0;
}

int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}

上一题