2017-11-25 161 views
0

我在python 3.5中解決了this問題。這裏是我的解決方案代碼:Python 3.5 - '//'和'int()'之間的區別

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後的頭髮拉扯時間我發現,改變LCM函數的行

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

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

解決了這個問題。這讓我好奇。我一直認爲int()和floor()函數對於正整數完全相同。既然我們確信分子和分母總是正面的,爲什麼這裏會出現這種差異呢? 任何樣本測試案例,其中int((a*b)/gcd(a,b))將不同於a*b//gcd(a,b)給定a,b是正整數?

更新: 抽樣檢測情況INT(A/B)是從不同// B:250263628386554294 1.

對於解釋see this

+1

是的但'int()'四捨五入操作數,'//'截斷結果。 –

+1

@cᴏʟᴅsᴘᴇᴇᴅ:不,'int'向0和'//'樓層四捨五入。 – user2357112

+1

@cᴏʟᴅsᴘᴇᴇᴅ:這是不正確的。 'int(9/10)'是'0'。 – BrenBarn

回答

6

你的數學概念似乎不錯,但什麼你缺少的是/產生一個浮點結果,以及浮點數有限精度:

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

即使除以1也會失去精度。相比之下,用//分開兩個整數,整數運算,沒有浮點中間結果,並且沒有丟失精度。

相關問題