我有这个函数用于计算带有eratosthenes筛子的素数。我有一个错误,我不明白为什么。
def era1(n):
llista1 = []
llista2 = []
i = 2
while(i<(n+1)):
llista1.append(i)
i = i + 1
while (llista1[0]<(n**0.5)):
llista2.append(llista1[0])
for j in range ((len(llista1))-1):
if (llista1[j] % llista1[0] == 0) : #<------- error list index out of range
llista1.remove(llista1[j])
llista1.remove(llista1[0])
print llista2
答案 0 :(得分:2)
这是在迭代它们时删除列表中的项目的结果。您已指定for循环运行n
次,但是当您到达第n个项目时,曾经存在的项目已经移回了几个索引,因为您要从中删除项目清单。
您需要重新考虑重新实现Sieve的方法。我不能百分之百地遵循你的方法,但我确信它可能涉及到一个辅助列表。白名单,不要黑名单:)。
此外,enumerate()
是一个很酷的功能。
答案 1 :(得分:0)
对于仍在寻找这种算法方法的任何人可能有用
def SieveOfEratosthenes(n):
# Create a boolean array "prime[0..n]" and initialize
# all entries it as true. A value in prime[i] will
# finally be false if i is Not a prime, else true.
prime = [True for i in range(n + 1)]
p = 2
while (p * p <= n):
# If prime[p] is not changed, then it is a prime
if (prime[p] == True):
# Update all multiples of p
for i in range(p * 2, n + 1, p):
prime[i] = False
p += 1
prime[0]= False
prime[1]= False
# Print all prime numbers
for p in range(n + 1):
if prime[p]:
print (p)
# driver program
if __name__=='__main__':
n = 30
print ("Following are the prime numbers smaller")
print ("than or equal to", n )
SieveOfEratosthenes(n)