在列表中查找素数,然后打印它们

时间:2017-12-01 18:28:07

标签: python-3.x

我必须为学校的项目生成素数。继承人要求:Eratosthenes的Sieve是一种优雅的算法,用于查找所有素数到达某个极限n。基本思想是首先创建一个从2到n的数字列表。第一个数字从列表中删除,并作为素数公布,并且从列表中删除最多为n的所有数字的倍数。此过程将继续,直到列表为空。例如,如果我们希望找到最多10个的所有素数,那么该列表最初将包含[2,3,4,5,6,7,8,9,10]。 2被删除并宣布为素数。然后移除4,6,8和10,因为它们是2的倍数。留下[3,5,7,9]。重复这个过程,3被宣布为素数,9被删除,因为它是9的倍数。离开[5,7]。等等。编写一个名为generatePrimes.py的程序,该程序提示用户输入数字n并输出小于或等于n的所有素数。我失去了

2 个答案:

答案 0 :(得分:1)

这个问题具有可怕的质量,并不值得回答,但这里有一个描述筛子的功能:

def pSieve(limit):
     flags = [True] * limit
     flags[0] = flags[1] = False
     primes = []
     for index, flag in enumerate(flags):
         if flag:
             primes.append(index)
             for n in range(index * index, limit, index):
                 flags[n] = False
     return primes

你可以看到它产生了正确的结果:

>>> pSieve(10)
[2, 3, 5, 7]
>>> pSieve(100)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

答案 1 :(得分:0)

def pSieve(n):
    m = (n-1) 
    b = [True]*m
    i,p,ps = 0,3,[2]
    while p*p < n:
        if b[i]:
            ps.append(p)
            j = 2*i*i + 6*i + 3
            while j < m:
                b[j] = False
                j = j + 2*i + 3
        i+=1; p+=2
    while i < m:
        if b[i]:
            ps.append(p)
        i+=1; p+=2
    return ps