Python int((n+1)/2)和(n+1)//2之间的差异?

Python int((n+1)/2)和(n+1)//2之间的差异?,python,python-3.x,Python,Python 3.x,在python中解决我使用的一个问题 此代码已被拒绝 但对于这一点: 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 可以接受,我的问题是为什么intn+1/2给出不同的ans,然后在大量n

在python中解决我使用的一个问题

此代码已被拒绝

但对于这一点:

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  

可以接受,我的问题是为什么intn+1/2给出不同的ans,然后在大量n<10^18时给出n+1//2?

Python中的双斜杠执行整数除法,而单斜杠执行常规的旧除法,这可能会产生浮点


我看不到你链接的问题中有任何地方要求你给出整数答案,但我想作者希望这样做是为了防止任何浮点精度错误阻止自动测试用例成功。

Python中的双斜杠执行整数除法,而单斜杠执行常规的旧除法,这可能会产生浮点

我看不到你链接到的问题中有任何地方要求你有一个整数答案,但我想作者希望这样做是为了防止任何浮点精度错误阻止自动测试用例的成功。

即使对于小n,intn*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和4999999999999998500000000001中可以看到信息的丢失,即使对于小n,intn*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和4999999999998500000000000000001中可以看到信息的丢失。请考虑:

导入系统 printsys.float\u信息 i=10**17+2/2 j=10**16+2/2 普林蒂,j 打印类型i,类型j i、 j=inti,intj 普林蒂,j 打印类型i,类型j 虽然你远没有达到浮点极限-你达到了浮点可以存储的数字极限-所以在这个极限之后的所有东西都会被指数符号截断-所以它的值的大小是相同的,但是后面所有多余的数字都是0

结论:

转换类型需要非常注意细节-只需使用\\即可。

考虑:

导入系统 printsys.float\u信息 i=10**17+2/2 j=10**16+2/2 普林蒂,j 打印类型i,类型j i、 j=inti,intj 普林蒂,j 打印类型i,类型j 虽然你远没有达到浮点极限-你达到了浮点可以存储的数字极限-所以在这个极限之后的所有东西都会被指数符号截断-所以它的值的大小是相同的,但是后面所有多余的数字都是0

结论:


转换类型需要非常注意细节-只需使用\\即可。

可能有某种溢出保护……这是否回答了您的问题?也许是某种溢出保护…这能回答你的问题吗@它是整数除法。从数学上讲,它与int/相同,但保证适用于所有整数,即使是具有数百位数的整数。这是因为计算只涉及整数,而不计算中间浮点。@gaurav它是整数除法。从数学上讲,它与int/相同,但保证适用于所有整数,即使是具有数百位数的整数。这是因为计算只涉及整数,而不计算中间浮点。