我用Eratosthenes的筛子写了一段代码来生成素数:
def prime_list(N):
p = 2
l = [x for x in range(p,N)]
new_l = [p]
while p**2 < N:
l = [l[x] for x in range(1,len(l)) if not l[x]%p == 0]
p = l[0]
new_l.append(p)
[l.insert(0,x) for x in new_l[len(new_l)-2::-1]]
return l
有人可以检查此代码是否正确吗?我认为这是因为它比我之前生成素数的代码更快:
for x in range(2,N):
for y in range(2,x):
if x%y == 0:
break
else:
print(x)
答案 0 :(得分:-1)
这是我写的其他代码。我现在将检查这一个或另一个是否更好。
import math
def primes(N):
number_list, limit = [x for x in range(2,N+1)], int(math.sqrt(N))
for n in range(0, limit):
if number_list[n] != -1:
for y in range(number_list.index(number_list[n])+1, len(number_list)):
if number_list[y] != -1:
if number_list[y]%number_list[n] == 0:
number_list[y] = -1
number_list = list(set(number_list))
number_list.remove(-1)
number_list.sort()
return number_list
好的,所以这段代码花了15.90秒来计算高达1,000,000的素数。 我发布的第一个只花了4.71秒来计算机质量高达1,000,000。 JF Sebastian说,如果你的代码有划分,那么它不是SOE,但为了查看每个数字是否是剩余数字的倍数,你需要使用模数运算符(基本上就像除法),不是吗?