【算法题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行),然后分子分母同时除以最大公约数即可,最后打印时用字符串连接的形式,'/'将化简后的分子和分母连接起来输出即可。

posted @ 2018-04-10 16:43  Fintech带你飞  阅读(427)  评论(0编辑  收藏  举报