赞
踩
[蓝桥杯python] 循环小数
问题描述
已知S是一个小于1的循环小数,请计算与S相等的最简真分数是多少。例如0.333...等于1/3,0.1666...等于1/6。
资源限制
时间限制:1.0s 内存限制:256.0MB
输入第一行包含两个整数p和q,表示S的循环节是小数点后第p位到第q位。第二行包含一个q位数,代表S的小数部分前q位。
输出两个整数,用一个空格分隔,分别表示答案的分子和分母。
样例输入
1 6
142857
样例输出
1 7
具体解析请大家自己看一下代码中的备注,在此不多做解释。
-
- 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)
结果:
自己写的所以有点复杂,但是至少能完成嘿嘿。如果各位有优化欢迎评论区讨论!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。