[蓝桥杯python] 循环小数
问题描述
已知S是一个小于1的循环小数,请计算与S相等的最简真分数是多少。例如0.333...等于1/3,0.1666...等于1/6。
1、资源限制
资源限制
时间限制:1.0s 内存限制:256.0MB
2、输入格式
输入第一行包含两个整数p和q,表示S的循环节是小数点后第p位到第q位。第二行包含一个q位数,代表S的小数部分前q位。
3、输出格式
输出两个整数,用一个空格分隔,分别表示答案的分子和分母。
4、样式输入及输出
样例输入
1 6
142857
样例输出
1 7
5、代码及解析
具体解析请大家自己看一下代码中的备注,在此不多做解释。
p,q = map(int,input().split())
S = int(input())
def gcd(a,b):
if a % b == 0:
return b
else:
return gcd(b,a%b)
#处理那种开头有不是循环的数
#例如0.166666可以分解为 0.1 +0.0666//999*10
#同理0,116666可以分解为 0,11+0.00666//999*10**2
if p !=1 :
#处理不是循环部分
a = int(str(S)[:p-1])
b = 10**(len(str(a)))
max_ab = gcd(a,b)
a = a//max_ab
b = b//max_ab
# 处理循环部分
c = int(str(S)[p - 1:])
d = (10 ** (len(str(c))) - 1)*10**(p-1)
max_cd = gcd(c, d)
c = c // max_cd
d = d // max_cd
e = a*d + c*b
f = b*d
max_ef = gcd(e,f)
e = e//max_ef
f = f//max_ef
print(e,f)
else:
#处理循环部分
c = int(str(S)[p-1:])
d = 10**(len(str(c)))-1
max_cd = gcd(c,d)
c = c//max_cd
d = d//max_cd
print(c,d)
结果:
自己写的所以有点复杂,但是至少能完成嘿嘿。如果各位有优化欢迎评论区讨论!!