使用除草剂筛的质数

时间:2019-11-06 04:05:00

标签: python

因此,我是python(以及一般而言)编程的新手,并且正在做一些编码方面的挑战。我遇到了这个“使用筛子法的质数”难题。我已经成功地尝试过,但是我觉得我的逻辑需要改进。

所以我所做的是在python中使用3 while循环,代码按预期工作,为我提供了一组质数,但是我找不到压缩它的方法。


import sys
n = int(sys.argv[1])
ls = []
i = 2
while i <= n:
    ls.append(i)
    i += 1

i = 0
while i < len(ls):
    if i == 0:
        pass
    else:
        ls[i] = ''
    i += 2

i = 1
while i < len(ls):
    if i == 1:
        pass
    else:
        ls[i] = ''
    i += 3

i = 0
while i < len(ls):
    if i == 0:
        pass
    else:
        ls[i] = ''
    i += 5

i = 0
primes = []
while i < len(ls):
    if ls[i] != '':
        primes.append(ls[i])
    i += 1

for prime in primes:
    print(prime,end=', ')

正如nvidia的首席执行官曾经说过的那样,“它确实有效”,但显然不是最佳方式:D

1 个答案:

答案 0 :(得分:0)

您的代码认为49是质数,这并不好。为每个素数进行while循环是行不通的。

这是一个简单的版本,可以执行以下操作:

import math

def primesLessThan(N):
    seive = [True] * N
    seive[0] = seive[1] = False
    for i in range(2,int(math.sqrt(N))+1):
        if (seive[i]):   # i is prime
            for j in range(2*i,N,i):   # all multiples of i >= 2i
                seive[j] = False       # j is composite since i is a factor
    return [p for p in range(2,N) if seive[p]]

print(primesLessThan(500))