Eratosthenes筛返回大的复合数(这是一个错误)

2024-04-18 23:36:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python实现Eratosthenes的筛选。它返回接近搜索范围结尾的复合数字:

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]

我做错什么了?你知道吗


Tags: infalsetrueforifdef结尾range
1条回答
网友
1楼 · 发布于 2024-04-18 23:36:04

问题是这条线:

 for n in range(i*i, n+1, i):

最初n被设置为参数值(默认值=1000),但是在for循环第一次执行之后,n将保持i < n < i + n。第二次执行for循环是错误的。你知道吗

您应该重命名正在使用的n之一。考虑给它起一个适当的名字,比如sieve_size,它更能描述它的实际功能。你知道吗

我想指出的一点是,虽然您的代码很聪明,但您正在修改您正在迭代的列表。这通常被认为是不好的做法。你知道吗

相关问题 更多 >