【算法题5】求不同进制表示的位数之和的均值
尽管是一个CS专业的学生,小B的数学基础很好并对数值计算有着特别的兴趣,喜欢用计算机程序来解决数学问题,现在,她正在玩一个数值变换的游戏。她发现计算机中经常用不同的进制表示一个数,如十进制数123表达为16进制时只包含两位数7、11(B),用八进制表示为三位数1、7、3,按不同进制表达时,各个位数的和也不同,如上述例子中十六进制和八进制中各位数的和分别是18和11,。 小B感兴趣的是,一个数A如果按2到A-1进制表达时,各个位数之和的均值是多少?她希望你能帮她解决这个问题? 所有的计算均基于十进制进行,结果也用十进制表示为不可约简的分数形式。
1 #coding=utf-8 2 3 def gcd(x,y): 4 if x>=y: 5 ma=x 6 mi=y 7 else: 8 ma=y 9 mi=x 10 11 if ma%mi==0: 12 return mi 13 else: 14 return gcd(mi,ma%mi) 15 16 a=int(raw_input()) 17 sum=0 18 for i in range(2,a): 19 m=a 20 while(m>0): 21 r=m%i 22 m=m/i 23 sum +=r 24 25 print str(sum/gcd(sum,a-2))+'/'+str((a-2)/gcd(sum,a-2))
18-23行代码解决了将数a表示成2进制到a-1进制的位数上的数值求和
因为题目要求将结果化简为分数,所以分子为sum,分母为a-2,需要求他们两个的最大公约数(辗转相除法实现,见3-14行),然后分子分母同时除以最大公约数即可,最后打印时用字符串连接的形式,'/'将化简后的分子和分母连接起来输出即可。