2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数
在线评测 Ideas对于一个纯循环小数,假设循环节为l,则小数为0.llll…,转换为分数就是 l / (10 ** n - 1),其中n为循环节L的长度。
也就是说,我们要找到一个真分数 x / y,等于 l / (10 ** n - 1),即x = l,y = 10 ** n - 1。
对于混合循环小数,可以把循环体和非循环体拆开,即设循环体为l,非循环体为k,则小数为0.klll…,我们可以把它拆成两部分:0.k + 0.l / (10 ** m),其中 m 为非循环体 k 的长度。
转换成分数就是 k / (10 ** m) + l / (10 ** n - 1) / (10 ** m) = (k + l / (10 ** n - 1)) / (10 ** m) = (k * (10 ** n - 1) + l) / ((10 ** n - 1) * (10 ** m))。
所以 x = (k * (10 ** n - 1) + l),y = ((10 ** n - 1) * (10 ** m))。
最后,我们要求的是最简真分数,所以还需要求一下 x 和 y 的最大公约数,让 x 和 y 再除一下。
Code Pythondef gcd(a, b):
return a if b == 0 else gcd(b, a % b)
if __name__ == '__main__':
p, q = map(int, input().split())
num = int(input())
m, n = p - 1, q - p + 1
k = int(num / (10 ** n))
l = int(num % (10 ** n))
x, y = k * (10 ** n - 1) + l, (10 ** n - 1) * (10 ** m)
g = gcd(x, y)
x, y = x / g, y / g
print(f"{int(x)} {int(y)}")



