雖然我很欣賞@DonatPants了詳細的解答,我認爲,解決辦法是太複雜了。首先,我們不需要計算sqrt()
,當更簡單的平方會做(即方程兩邊的平方)。第二個測試順序似乎是落後的,爲什麼在if number % prime == 0
之後檢查prime > sqrt
?如果prime > sqrt
,你不需要其他測試。那布爾值是什麼?我簡單的方法解決這個問題:
primes = [2]
for number in range(3, 2000000 + 1, 2): # only test odd numbers
for prime in primes:
if prime * prime > number: # we're past sqrt, a prime!
primes.append(number)
break
if number % prime == 0: # a composite
break
print(sum(primes))
將冗餘計算prime * prime
是一個低效率。它對這個數字範圍並沒有什麼區別,但是如果需要的話,你可以保留一個單獨的正方形數組,枚舉素數並使用生成的索引來訪問正方形,當你保存素數的時候可以保存這個正方形。只是將素數平方比所有數字的平方根便宜:
primes = [2]
squares = [4]
for number in range(3, 2000000 + 1, 2):
for index, prime in enumerate(primes):
if squares[index] > number:
primes.append(number)
squares.append(number * number)
break
if number % prime == 0:
break
print(sum(primes))
我們浪費空間來避免浪費時間。但是,再次,對於這個範圍的數字,這是不值得的。
@ Jacobr365這是不正確的,中斷進入'number + = 1'行,因此while循環的下一次迭代if語句將是'if 3%2 == 0',否則將執行。但y值永遠不會改變 –
@ DonatPants謝謝。這就是我從手機進行編輯的結果。甚至沒有注意到這條線。刪除評論。 – Jacobr365
你的程序確實終止了,但是你沒有給它足夠的時間,我把if(primes [-1])> = 2000000:'改成if if(primes [-1])> = 200:'程序終止。讓你的程序更高效,以便它能夠工作。 –