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个数字。
答案 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。
显然,还有其他(更好的)方法可以解决问题,但我只是想指出如何改进当前的解决方案。