Python 3.5 - ' //'之间的区别和' int()'

时间:2017-11-25 19:49:09

标签: python python-3.x

我在python 3.5中解决了see this问题。这是我的解决方案代码:

def gcd(a, b):
if b == 0:
    return a
return gcd(b, a % b)

def lcm(a, b):
    return int((a*b)/gcd(a,b))

def core():
    N = int(input())
    nums = [int(x) for x in input().split()]
    ans = lcm(nums[0], nums[1])
    for i in range(0, N):
        for j in range(i+1, N):
            ans = min(ans, int(lcm(nums[i], nums[j])))
    return int(ans)

for t in range(1, int(input()) + 1):
    print(core())

它给了我错误的子任务答案3.经过几个小时的拔毛我发现改变了线

return int((a*b)/gcd(a,b))

在lcm函数中

return (a*b)//gcd(a,b)

解决了这个问题。这让我很好奇。我一直认为int()和floor()函数对于正整数是完全相同的。既然我们确信分子和分母总是积极的,为什么这里会出现这种差异? 给定a,b的int((a*b)/gcd(a,b))a*b//gcd(a,b)不同的任何样本测试用例都是正整数?

更新 示例测试用例,其中int(a / b)与// b不同:250263628386554294 1.

有关解释link

1 个答案:

答案 0 :(得分:6)

您对数学的理解似乎很好,但您遗漏的是/产生浮点结果,而浮点数的精度有限:

>>> x = 2**64-1
>>> x
18446744073709551615
>>> int(x / 1)
18446744073709551616

即使除以1也会失去精确度。相比之下,用//除以两个整数完全在整数运算中,没有浮点中间结果而且不会丢失精度。