7.python解答2018年第九届蓝桥杯省赛C++A组 分数
标题:分数
1/1 + 1/2 + 1/4 + 1/8 + 1/16 + …
每项是前一项的一半,如果一共有20项,求这个和是多少,结果用分数表示出来。
类似:3/2
当然,这只是加了前2项而已。分子分母要求互质。
注意:
需要提交的是已经约分过的分数,中间任何位置不能含有空格。
请不要填写任何多余的文字或符号。
答案:1048575/524288
思路:可以用等比求和公式Sn=a1(1-q^n)/(1-q) 来计算,算出来是1048575/524288,如果不确定分子分母是否互质的话可以再来个gcd。
代码
方式1
因为算出来220-1 和219是互质的可以使用python内置**
计算运算符
print('{}/{}'.format(2**20-1, 2**19))
# 1048575/524288
#如果不知道互质,使用gcd函数检查
import math
a = math.gcd(2**20-1, 2**19)
方式2,通过二进制移位
print('{}/{}'.format((1<<20) - 1, 1<<19)) # 移位运算符比 - 优先级低
方式3.模仿C语言解法
# 分数
# 求最大公约数
def gcd(a,b):
if(b==0):
return a
return gcd(b, a%b)
# 快速求指数幂
def pow_e(e, b):
x = e
res = 1
while b>0:
if b&1:
res *= x;
b >>= 1
x = x*x
return res
a = pow_e(2,20) - 1
b = pow_e(2,19)
g = gcd(a,b)
if g==1:
print('{}/{}'.format(a,b))
else:
print('{}/{}'.format(int(a/g),int(b/g)))