2014-11-04 70 views
-5
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个以上的数字,而不是素数。我试图找到所有在python下的200万以下的素数总和

+0

你正在做大量'float'到'int'的转换。这些都受到一些舍入误差。如果可能的话,我会尝试尽可能使用'int'。 – 2014-11-04 16:47:47

回答

0

你的算法给出错误的结果,无法弄清楚你用什么方法,它会更好,如果你能提供更多的细节。

有一个称为筛埃拉托色尼算法有效地生成素数的算法。你发现算法解释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 
0

问题是这一行:

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

浮置(200万/ 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 

这种方式,而不是分裂,然后相乘,你只是经历和标记我的所有的倍数,直到2000000

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

相关问题