2017-11-25 16 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のために私に間違った答えを与えていた

その

return (a*b)//gcd(a,b) 
にLCM関数のライン

return int((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で割っても精度が失われる可能性があります。対照的に、2つのintを//で除算することは、浮動小数点の中間結果なしで精度を失うことなく、完全に整数演算で機能します。

関連する問題