使用Python查找数字是否为素数

时间:2011-07-02 04:08:02

标签: python algorithm math primes

  

可能重复:
  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,我得到了错误的答案。请告诉我出错的地方,而不只是张贴自己的程序。 使用平方根提到的其他帖子,但我没有真正得到它。

感谢。

1 个答案:

答案 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]):