可能重复:
Fastest way to list all primes below N in python
Checking if a number is a prime number in Python
我正在研究Project Euler Problem 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 :(得分: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]):