首页 > 试题广场 >

进制均值

[编程题]进制均值
  • 热度指数:16115 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
尽管是一个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
n=int(input())
a=[]
for i in range(2,n):
    num=n
    while num>0:
        a.append(num%i)
        num=num//i

def simplify(a,b):
    i=2
    while i<=min(a,b):
        if a%i==0 and b%i==0:
            a = a // i
            b = b // i
        else:
            i+=1
    return '%d/%d'%(a,b)
print(simplify(sum(a),n-2))
发表于 2019-01-11 17:08:27 回复(0)

import sys
def func(n, m):     s = 0     if n < m:         s = s + n     else:         i = 1         while 1:             if m ** i <= n < m ** (i + 1):                 s = s + 1                 break             i += 1         n = n - m ** i         if n:             s0 = func(n, m)             s = s + s0     return s
def ***(n,m):     t = n % m     while t:         n = m         m = t         t = n % m     return m
if __name__ == '__main__':     n = int(sys.stdin.readline().strip())     s_all = 0     for i in range(2, n):         s = func(n, i)         s_all = s_all + s     length = len(range(2, n))     *** = ***(s_all, length)     a,b = int(s_all/***), int(length/***)     print('{0}/{1}'.format(a, b))

发表于 2018-11-22 20:00:34 回复(0)
A=int (raw_input())
t=A-2
count=0
for i in range(2,A):
    n=A
    while n:
        count +=n%i
        n //=i
def hcf(x,y):
    for i in range(2,y+1):
        while x%i==0 and y%i==0:
            x //=i
            y //=i
            
    return (x,y)
(count,t)=hcf(count,t)
print str(count)+'/'+str(t)
发表于 2018-09-23 17:52:14 回复(0)
def f(n, m): # 求最大公约数
    while m > 0:
        t = n % m
        n = m
        m = t
    return n

if __name__ == '__main__':
    while 1:
        try:
            A=int(input())
        except:
            break
        X = 0 # 不同进制位数和
        for i in range(2,A): # 换算成2至n-1进制
            temp = A
            while temp!=0: #当商不为0时,辗转相除
                X += temp % i # 将余数累加
                temp = temp // i #商
        Y=A-2 #不同的进制数
        m = f(X, Y) # 求X和Y的最大公约数
        X , Y = X//m, Y//m # 结果除以最大公约数
        print('%d/%d'%(X,Y))

发表于 2018-05-16 15:41:48 回复(0)

python解法:

在化简的时候先求分子和分母的最大公约数,再将这两个数同时除以最大公约数即可。

from math import gcd

def calcSumOfANumber(number):
    total = 0
    for i in range(2, number):
        res, num = 0, number
        while num:
            res += num % i
            num = num // i
        total += res
    return total

while True:
    try:
        a = int(input())
        b = calcSumOfANumber(a)
        gcdRes = gcd(b, a - 2)
        print(str(b // gcdRes) + "/" + str((a - 2) // gcdRes))
    except:
        break
发表于 2018-04-13 17:13:19 回复(0)
def mov(d,i):
    x = 1
    t = int(d/i)
    while (t >= i):
        t = int(t/i)
        x += 1
    d = d - t*(i**x)
    return t,d

##该函数计算a,b的最小公约数
def dev(a,b):
    while(a%b!=0):
        temp = a%b
        a = b
        b = temp
    return b

while True:
    try:
        A = int(input())
        s = 0
        for i in range(2,A,1):
            d = A
            while (d>=i):
                t,d = mov(d,i)
                s += t
            s += d
        b = dev(s,A-2)
        print (int(s/b),end='')
        print ('/',end='')
        print (int((A-2)/b))
    except:
        break

发表于 2018-04-03 20:56:34 回复(0)
from fractions import Fraction
import math
num = int(input())
result = 0
for x in range(2, num):
    a = num
    while (a != 0):
        a, b = divmod(a, x)
        result += b
if math.modf(result / (num - 2))[0] == 0:
    print(str(result // (num - 2)) + "/1")
else:
    print(Fraction(result, num - 2))


发表于 2017-11-06 21:45:28 回复(0)
def SysConvert(N,x):
    remainder = []
    while(N >= x):
        remainder.append(N%x)
        N =int( N/x)
    remainder.append(N%x)
    return sum(remainder)
def GetAllSum(N):
    sum = 0
    n = 0
    for i in range(2,N):
        sum += SysConvert(N, i)
        n += 1
    return sum,n
def gcd(x, y):
    while y != 0:
        (x, y) = (y, x % y)
    return x
def PrintOut(N):
    sums,lens = GetAllSum(N)
    gcds = gcd(sums,lens)
    result = '/'.join([str(int(sums/gcds)),str(int(lens/gcds))])
    return result
import sys

N = int(input())
print(PrintOut(N))

发表于 2017-09-10 15:34:19 回复(0)
#coding=utf-8
import sys
def zero(a):
    for i in a:
        if i==0:
            continue
        else:
            return False
    return True
def o2n(a,old,new):
    r=[]#存储商
    b=[]#存储新进制数
    while not zero(a):
        t=0
        for i in a:
            t=t*old+i
            r.append(t//new)#除新进制数new得到商
            t%=new#取余数
        b.append(t)#存储余数
        a=[i for i in r]#把商传给a数组
        r=[]#清空r数组
    b.reverse()
    return b
def div(a,b):
	for i in range(min(a,b),1,-1):
		if a%i==0 and b%i==0:
			a/=i
			b/=i
			break
	return a,b
	
a=input()
s=map(int,str(a))
sm=0
for i in range(2,a):
	sm+=sum(o2n(s,10,i))
x,y=div(sm,a-2)
print '%d/%d'%(x,y)

发表于 2017-08-25 10:45:13 回复(0)