我试图在python中找到200万以下所有素数的总和

时间:2014-11-04 16:44:48

标签: python

ls = []
total = 0

for i in range(0,2000000):
    ls.append(i)

for i in range(2,2000000):
    for x in range(2,int(float(2000000/i)+0.5)):
        ls[int(float(i*x))] = 0
ls[1] = 0

for j in range(0,2000000):
    total += ls[j]
print total

这段代码给了我错误的答案。它包括不是素数的大数。它包括比素数多25个数字。

2 个答案:

答案 0 :(得分:0)

您的算法给出了错误的结果,无法确定您使用的是什么方法,如果您能提供更多详细信息会更好。

有一种名为Sieve of Eratosthenes算法的算法可以有效地生成素数。您会发现该算法解释了in this thread,其中包含编写算法的详细信息。

import math
def primeNumbers(n):
    A = range(2, n + 1) 
    B, C= [],A
    while C[0]< math.sqrt(n): 
        firstElement= C[0]
        B+= [firstElement]
        C= [x for x in C if x%firstElement!=0] 
    return B+C 

t= sum(primeNumbers(2000000)) #you summ the prime numbers numbers 
print t

答案 1 :(得分:0)

问题在于这一行:

    for x in range(2,int(float(2000000/i)+0.5)):

float(2000000 / i)在这种情况下做的不多,你的意思是浮动(2000000)/ i?您仍在进行整数除法,然后将结果转换为浮点数。因此,当我是947时,它返回2111.0而不是2111.93。结果,向它添加0.5并调用int()实际上没有做任何事情,你仍然最终得到2111。

然后这将循环运行到2110,所以你没有标记947 * 2111,这会给你误报。

您可以稍微重写循环以解决此问题:

for i in range(2,2000000):
    for x in range(2 * i, 2000000, i):
        ls[x] = 0

通过这种方式,您可以简单地通过并标记i的所有倍数,直到2000000。

显然,还有其他(更好的)方法可以解决问题,但我只是想指出如何改进当前的解决方案。