我在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
答案 0 :(得分:6)
您对数学的理解似乎很好,但您遗漏的是/
产生浮点结果,而浮点数的精度有限:
>>> x = 2**64-1
>>> x
18446744073709551615
>>> int(x / 1)
18446744073709551616
即使除以1也会失去精确度。相比之下,用//
除以两个整数完全在整数运算中,没有浮点中间结果而且不会丢失精度。