Python中Eratosthenes的紧凑筛子

时间:2014-10-06 14:33:20

标签: python optimization

我需要在Python中实现Sieve of Eratosthenes,但是由于它涉及大量代码,因此希望尽可能紧凑地实现它。虽然有很多很多更有效的方法来完成寻找素数,但我想看看Python能以疯狂的紧凑性为我做些什么。

程序需要询问用户输入,然后使用从2到输入数字的筛子输出所有素数。

到目前为止我能做的最好的是:

n = int(input("To what n do you wish to find primes? "))
sieve = list(range(2, n+1))
for i in range(len(sieve)):
    for j in range(i+1, len(sieve)):
        if sieve[i] == 0:
            continue
        if sieve[j] % sieve[i] == 0:
            sieve[j] = 0
print([i for i in sieve if i != 0])

除此之外,我无法进一步缩小代码。

编辑: 在提出这个问题之前无法找到使这一个重复的回复,因为我被专门搜索“Eratosthenes的紧凑筛子”及其变化。谢谢!

1 个答案:

答案 0 :(得分:0)

以下是我提出的建议:

n = [False for i in range(int(input('> '))+1)]
n[0] = n[1] = True
for i in range(2, len(n)):
    for j in range(i+1, len(n)):
        n[j] = ((j % i) == 0) if not n[j] else n[j]
print([i for i in range(len(n)) if not n[i]])