python 中的奇怪除法行为

Weird behaviour of division in python

我正在尝试解决 hackerrank 中的 this 问题。在某些时候,我必须检查一个数字是否整除 n(给定输入)。

除了一个测试用例(不是问题),此代码运行良好:

if __name__ == '__main__':
    tc = int(input().strip())
    for i_tc in range(tc):
        n = int(input().strip())
        while n % 2 == 0 and n is not 0:
            n >>= 1
        last = 0



        for i in range(3, int(n ** 0.5), 2):
            while n % i == 0 and n > 0:
                last = n
                n = n // i        # Concentrate here


        print(n if n > 2 else last)

现在您可以看到,只有当 i 是 n.For 的因数时,我才除以数字。例如,如果数字是 i = 2 和 n = 4,则 n / 2 和 n // 2 不是'有什么区别吧。

但是当我使用下面的代码时,所有测试用例都失败了:

if __name__ == '__main__':
    tc = int(input().strip())
    for i_tc in range(tc):
        n = int(input().strip())
        while n % 2 == 0 and n is not 0:
            n >>= 1
        last = 0
        for i in range(3, int(n ** 0.5), 2):
            while n % i == 0 and n > 0:
                last = n
                n = n / i      # Notice this is not //
        print(n if n > 2 else last)

这不是第一个 time.Even this 问题我遇到了同样的问题 thing.For 这个问题我只需要除以 2 所以我使用右移运算符来摆脱this.But这里我什么也做不了,因为右移帮不了我。

为什么会这样?如果数字很小,我看不出有什么区别,但随着数字变大,它的行为会有所不同。

当 / 失败时使用 // 甚至不直观。这是什么原因?

由于niintn % i == 0类型,所以n // in / i之间存在差异的主要原因是那个

  1. n // i 的类型仍然是 intn / i 的类型是 float
  2. Python 中的整数具有无限精度,而浮点数的精度是有限的。

因此,如果 n // i 的值超出了 python float 类型可以准确表示的范围,那么它将不等于 [的计算值=12=].

插图:

>>> (10**16-2)/2 == (10**16-2)//2
True
>>> (10**17-2)/2 == (10**17-2)//2
False
>>> int((10**17-2)//2)
49999999999999999
>>> int((10**17-2)/2)
50000000000000000
>>>