gpt4 book ai didi

python - python中除法的奇怪行为

转载 作者:太空狗 更新时间:2023-10-29 20:21:02 25 4
gpt4 key购买 nike

我正在尝试解决 this hackerrank 中的问题。在某些时候,我必须检查一个数字是否整除 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 的因数时,我才对数字进行除法。例如,如果数字是 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)

这不是第一次了。即使是this问题我遇到了同样的事情。对于这个问题,我只需要除以 2,所以我使用右移运算符来摆脱这个问题。但是在这里我无能为力,因为右移不能帮助我。

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

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

最佳答案

n//in/i 之间差异的主要原因是 niint 类型,n % i == 0

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

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

插图:

>>> (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
>>>

关于python - python中除法的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46545423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com