📜  有理数的十进制展开(1)

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

有理数的十进制展开

介绍

当我们学习数学时,我们都学过什么是有理数。在这里,我们将介绍有理数的十进制展开。

所谓有理数的十进制展开,就是将一个有理数在十进制下表示为一个小数的形式。如何表示呢?对于任何一个有理数,它都可以表示为一个分数的形式,即p/q(p和q都是整数,且q不等于0)。因此,我们可以采用类似于小学奥数的方法,将分数转换为小数,具体实现方法就是将分子除以分母。由此,我们就可以得到有理数的十进制展开。

例如,将3/4转化为十进制数:

3 / 4 = 0.75
实现

下面是用Python实现有理数的十进制展开的代码:

def rational_to_decimal(p: int, q: int) -> str:
    if p == 0:
        return "0"
    res = []
    if p * q < 0:
        res.append("-")
    p, q = abs(p), abs(q)
    res.append(str(p // q))
    p %= q
    if p == 0:
        return "".join(res)
    res.append(".")
    dic = {}
    while p != 0:
        if p in dic:
            res.insert(dic[p], "(")
            res.append(")")
            break
        dic[p] = len(res)
        p *= 10
        res.append(str(p // q))
        p %= q
    return "".join(res)

该函数将分子p和分母q作为参数传入,并返回p/q的十进制展开。

在实现这个函数时,我们需要注意以下几点:

  • 当分子为0时,我们应该直接返回"0"。
  • 当分子和分母的乘积小于0时,我们需要在结果前面添加一个"-",表示负数。
  • 需要用p // q来得到商,用p % q得到余数。
  • 如果余数为0,表示分数可以被化为一个整数,我们就可以直接返回结果。
  • 如果余数不为0,那么我们需要将余数乘以10,再次进行整除和求余,直到余数为0或者某个余数重复出现。需要用一个字典来判断余数是否出现过。
示例

下面是一些示例:

rational_to_decimal(3, 4)
# "0.75"
rational_to_decimal(5, 3)
# "1.(6)"
rational_to_decimal(-17, 6)
# "-2.8(3)"