我试图解决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的因子时除以数字。例如,如果数字是i = 2且n = 4那么n / 2和n // 2不是&#39 ; t使任何差异都正确。
但是当我使用下面的代码时,所有测试用例都会失败:
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,所以我使用右移操作符来摆脱这个。但是我可以& #39; t做任何事情,因为右移不能帮助我。
为什么会这样?如果数字很小,我看不出任何差异,但随着数字变大,它在某种程度上表现不同。
在/失败时使用//甚至不直观。这是什么原因?
答案 0 :(得分:9)
鉴于n // i
和n / i
属于n
和i
,int
和n % i == 0
之间存在差异的主要原因是
n // i
的类型仍然是int
,而n / i
的类型是float
和因此,如果n // i
的值超出了python float
类型可准确表示的范围,那么它将不等于n / i
的计算值。 / p>
插图:
>>> (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
>>>