进制均值

京东的笔试题

1、描述:

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

一个数A如果按A-1进制表达时,各个位数之和的均值时多少?

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

样例输入:

5

3

样例输出:

7/3

2/1

2、分析:

求各个位数之和,即先求出各个位的值,再求和。和十进制求各个位类似,使用循环,每次对进制取余即位数值,再对进制相除为下次循环值。和的均值即除进制A-2即可。还有最简要求,则需要对和SUM和A-2除去最大公约数。

3、步骤:

1)输入n

2)对n按2到n-1进制求各位数之和:

循环:循环取余求和,相除进下次循环

3)对各位数和sum和计算进制次数n-2求最大公约数r

4)输出约分后的最简分数形式

4、实现代码:

 

// 进制均值.cpp : 
//

#include "stdafx.h"
#include "iostream"
using namespace std;

//位数求和
int hexSum(int a, int b)
{
	int sum = 0;
	while (a)
	{
		sum += (a%b);
		a = a/b;
	}
	return sum;
}
//最大公约数
int  gcd(int a, int b)
{
	int r;
	while (b)//因为个位数的和必定大于进制次数,所以在使用相除法时没有进行数值比较
	{
		r = a%b;
		a = b;
		b = r;
	}
	return a;
}
int main()
{
	int n;
	while (cin>>n)
	{
		int s = 0;
		for (int i = 2; i < n; i++)//循环求各位数和
		{
			s += hexSum(n, i);
		}
		int r = gcd(s, n-2);//求最大公约数
		cout << s / r << '/' << (n - 2) / r << endl;//输出最简分数形式
		
	}

    return 0;
}


因为习惯了c,在网上看到有直接使用函数gcd求最大公约数,好像是GNC编译器提供的,并不是标准库,所以我还是简单写了实现。

 

联系:zhangyuace@foxmail.com

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值