埃拉托色尼筛法 returns 大合数(错误)
Sieve of Eratosthenes returns large composite number (which is an error)
我正在 Python 中实施埃拉托色尼筛法。它 returns 搜索范围末尾附近的合数:
def primes_Ero(n=1000):
primes = []
a = [True]*(n+1)
a[0] = a[1] = False
for (i,isprime) in enumerate(a):
if isprime:
for n in range(i*i,n+1, i):
a[n] = False
primes.append(i)
return primes
当使用更大的数字时,n,我最终得到了合数。我检查了哪些数字是复合的(与蛮力方法相比),
给定 n,哪些数字是合数:
n= 100; []
n= 500; [493, 497]
n= 1000; [961, 989]
n= 10000; [9701, 9727, 9797, 9853, 9869, 9917, 9943, 9953, 9983, 9991, 9997]
我做错了什么?
问题出在这一行:
for n in range(i*i, n+1, i):
最初n
设置为参数值(默认=1000)但在for循环第一次执行后n将保持i < n < i + n
。第二次执行for循环出错
您应该重命名您正在使用的 n
之一。考虑给它一个像 sieve_size
这样的专有名称,这样更能描述它的实际作用。
我想指出的一件事是,虽然您的代码很聪明,但您 正在修改您正在迭代的列表。这通常被认为是不好的做法。
我正在 Python 中实施埃拉托色尼筛法。它 returns 搜索范围末尾附近的合数:
def primes_Ero(n=1000):
primes = []
a = [True]*(n+1)
a[0] = a[1] = False
for (i,isprime) in enumerate(a):
if isprime:
for n in range(i*i,n+1, i):
a[n] = False
primes.append(i)
return primes
当使用更大的数字时,n,我最终得到了合数。我检查了哪些数字是复合的(与蛮力方法相比),
给定 n,哪些数字是合数:
n= 100; []
n= 500; [493, 497]
n= 1000; [961, 989]
n= 10000; [9701, 9727, 9797, 9853, 9869, 9917, 9943, 9953, 9983, 9991, 9997]
我做错了什么?
问题出在这一行:
for n in range(i*i, n+1, i):
最初n
设置为参数值(默认=1000)但在for循环第一次执行后n将保持i < n < i + n
。第二次执行for循环出错
您应该重命名您正在使用的 n
之一。考虑给它一个像 sieve_size
这样的专有名称,这样更能描述它的实际作用。
我想指出的一件事是,虽然您的代码很聪明,但您 正在修改您正在迭代的列表。这通常被认为是不好的做法。