“我正在尝试在Hackerrank上解决这个问题:euler003。在某些时候,我必须检查一个数字是否能够被n(给定的输入)整除。
现在你可以看到,当i是n的因数时,我只会对这个数字进行除法。例如,如果数字为i=2和n=4,则n/2和n//2没有任何区别。
但是,当我使用下面的代码时,所有测试用例都失败了:
这不是第一次了,即使对于这个问题,我也遇到了同样的情况。对于这个问题,我只需要除以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 # 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)
这不是第一次了,即使对于这个问题,我也遇到了同样的情况。对于这个问题,我只需要除以2,所以我使用了右移运算符来摆脱这个问题。但在这里我什么都做不了,因为右移无法帮助我。
为什么会这样?如果数字很小,我看不出有任何区别,但随着数字变大,它会以某种方式表现出不同的行为。
甚至当/失败时,使用//也不直觉。这是什么原因?
n
是10**12
),而且所有的浮点除法和取模运算应该得到精确的结果。但我完全同意第(3)点。 - Mark Dickinson.0
。因此,对于输入51
(例如),该网站期望输出字符串"17"
,但实际得到的是"17.0"
。 - Mark Dickinson