📌  相关文章
📜  国际空间研究组织 | ISRO CS 2007 |问题 72(1)

📅  最后修改于: 2023-12-03 15:37:13.845000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2007 |问题 72

问题描述

给定两个整数 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 字典来记录小数部分的循环节。如果在转化的过程中发现有除数与某个之前计算过的余数相同,则说明出现了循环。

参考链接