在python中,我使用了一个问题https://www.spoj.com/problems/APM
t = int(input())
while t > 0:
n= int(input())
if n%2 == 0:
print(-1)
else:
n = int((n+1)/2)
print(n,n-1)
t -= 1
此代码被拒绝
但是为此:
t = int(input())
while t > 0:
n= int(input())
if n%2 == 0:
print(-1)
else:
n = (n+1)//2
print(n,n-1)
t -= 1
接受,我的问题是为什么int((n + 1)/ 2)在n <10 ^ 18时给出与(n + 1)// 2不同的ans?
答案 0 :(得分:4)
即使对于较小的n
来说,int(n*(n-1)/2) == n*(n-1)//2
确实可能对较大的n
失败。原因是/
是浮点除法,这会导致信息丢失,而信息int()
无法恢复:
>>> n = 10**18 - 1
>>> n*(n-1)
999999999999999997000000000000000002
>>> n*(n-1)//2
499999999999999998500000000000000001
>>> n*(n-1)/2
5e+35
>>> int(n*(n-1)/2)
500000000000000021210318687008980992
从5e+35
到499999999999999998500000000000000001
可以看到信息丢失
答案 1 :(得分:1)
考虑:
import sys
print(sys.float_info)
i=(10**17+2)/2
j=(10**16+2)/2
print(i,j)
print(type(i), type(j))
i,j=int(i),int(j)
print(i,j)
print(type(i), type(j))
尽管您还远远没有达到float
的限制-达到了float可以存储的数字的限制-因此,超出此限制的所有内容都将被指数符号截断-因此,值的大小相同,但后面所有多余的数字都是0
。
结论:
转换类型需要非常注意细节-只需使用\\
。
答案 2 :(得分:0)
Python中的双斜杠执行整数除法,而单斜杠执行常规的旧除法,这可能会产生浮点数。
我看不到您链接到的问题的任何地方都要求您有一个整数答案,但是我想作者希望以此方式防止任何浮点精度错误,从而阻止自动测试用例的成功