📅  最后修改于: 2023-12-03 15:37:13.845000             🧑  作者: Mango
给定两个整数 n 和 d,你需要把 1/n 展开成十进制分数,并且仅保留小数点后的 d 位。
输入文件的第一行包含一个整数 T,表示测试数据组数。
接下来 T 行,每行包含两个整数 n 和 d。
对于每组测试数据,输出一行一个小数,表示所求的分数。保留小数点后 d 位。
2
2 2
3 5
0.50
0.33333
这是一道模拟题,我们需要模拟小学学习分数的过程,将一个分数化成最简数形式,之后再通过乘以 10^d 的方式将分数转化成小数,并取小数点后的 d 位。
具体实现细节可以参见下面的代码。
T = int(input())
for _ in range(T):
n, d = map(int, input().split())
# 分数化简
for i in range(2, min(n, d) + 1):
while n % i == 0 and d % i == 0:
n //= i
d //= i
# 分数转小数
ans = ''
rem = {}
r = n % d
ans += str(n // d)
if r:
ans += '.'
while r != 0 and r not in rem:
rem[r] = len(ans)
r *= 10
ans += str(r // d)
r %= d
if r in rem:
ans = ans[:rem[r]] + '(' + ans[rem[r]:] + ')'
print(ans[:2+d] if ans[-1] == ')' else ans)
其中,使用 rem 字典来记录小数部分的循环节。如果在转化的过程中发现有除数与某个之前计算过的余数相同,则说明出现了循环。