int((n + 1)/ 2)和(n + 1)// 2之间的区别是什么?

时间:2020-05-09 12:30:33

标签: python python-3.x

在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?

3 个答案:

答案 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+35499999999999999998500000000000000001可以看到信息丢失

答案 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中的双斜杠执行整数除法,而单斜杠执行常规的旧除法,这可能会产生浮点数。

我看不到您链接到的问题的任何地方都要求您有一个整数答案,但是我想作者希望以此方式防止任何浮点精度错误,从而阻止自动测试用例的成功

相关问题