2011-07-02 56 views
-4

可能重複一個數是素數:
Fastest way to list all primes below N in python
Checking if a number is a prime number in Python發現,如果使用Python

我工作的項目歐拉問題10,該條規定如下:

Find the sum of all the primes below two million. 

這是我的程序:

numbers = [] 
sum = 0 
range_number = 2000000 

#Appends all numbers in range 
for i in range(2, range_number): 
    numbers.append(i) 

#i is every entry in numbers, n is the multiples of numbers[i] starting at one 
#value of numbers[i] after i. This is the Sieve of Eratosthenes. 
for i in range(0, len(numbers)-1): 
    if numbers[i] != None: 
     for n in range(i + numbers[i], len(numbers)-1, numbers[i]): 
      numbers[n] = None 

#Adds all the numbers that are not None 
for i in numbers: 
    if i != None: 
     sum += i 

print(sum) 

我的程序將範圍下面的每個數字的所有倍數更改爲無,這應該消除所有組合並只留下質數。

當我爲range_number插入一個簡單的數字(如10)時,我得到了錯誤的答案。不要只發布自己的程序,請告訴我我哪裏出錯了。 使用平方根提到的其他帖子,但我沒有真正明白。

謝謝。

+0

沒有辦法,這是你的實際代碼;你不能將一個整數賦給'range',然後嘗試調用'range()'。你沒有得到錯誤的答案,你會得到一個異常告訴你整數不可調用。 – geoffspear

+0

你說得對,我只是爲了清晰而添加了變量。謝謝,我會解決它。 – LonelyWebCrawler

+1

該帖子中的函數is_prime(a)是不同的,它檢查每個小於輸入的數字,如果它是一個因子,並且對於我的程序來說太長。 – LonelyWebCrawler

回答

1

你的問題是,你永遠不會消除數字中的最後一個數字。如果RANGE_NUMBER是21,然後LEN(數)爲20和len(數字)-1是19.所以這條線的位置:

for n in range(i + numbers[i], len(numbers)-1, numbers[i]): 

從來沒有真正從列表中刪除數20。如果你打印出列表,你可以看到這個。因此,如果range_number比素數多一個,那麼當前您的解決方案會給出正確的答案,但當range_number比一個複合數多一個時,它將被range_number-1關閉。

爲了解決這個問題,只需更改行是:

for n in range(i + numbers[i], len(numbers), numbers[i]): 
+0

我終於得到了正確答案,即142,913,828,922。謝謝! – LonelyWebCrawler