好的,我正在试图筛选Eratosthenes。我最初使用此代码。
def shake(n):
n == 2 # initializes 2 since it's first prime
prime = [] # makes empty list
for i in range(2, n+1): # takes range from 2 to N
if i not in prime:
print (i)
for i in range(i*i, n+1, i):
prime.append(i)
shake(100)
它打印出一个列表,但我被告知我做错了。我被告知我需要传入一个布尔列表,并返回一个素数列表。逻辑是我从长度为N的输入中列出一个布尔值列表。我想出了如何使用这个列表布尔值
def shake(alist)
N = 10
alist = [True for _ in range(N + 1)]
如果我使用打印件就会给我这个。
[True True True True True True True True True True True]
我需要能够将前两个值true转换为false,然后将第三个'true'的值保留为true,但将所有两个的倍数变为false,然后对3,5,5执行相同的逻辑, 7等等,直到我用完了清单。然后我需要能够以某种方式扫描它以获得剩余的真值,并打印出这些数字的列表作为我的素数。我真的输了,因为我不知道如何将我的'True'列表的值更改为false,以及如何在循环中执行此操作以及我如何知道何时停止。任何帮助将不胜感激。
答案 0 :(得分:1)
def primes(n):
"""Finds all the primes less than n."""
#First build your list of Trues
ps = [1] * n
#next, set the first two entries to False
ps[0]=0; ps[1]=1
#i is the index, p_i is the primality value.
#the int(n**0.5) part makes us only look at the numbers less than the square
#root of n.
for i, p_i in enumerate(ps[:int(n**0.5)]):
#if p_i is True then i is prime
if p_i:
#mark off every ith number from i^2 as nonprime
for j in xrange(i*i, n, i):
ps[j]=0
#return every index that has the value True
return [i for (i, p_i) in enumerate(ps) if p_i]
您有一个全部标记为素数的数字列表。你取第一个数字n,从它的正方形开始,你将每第n个数字标记为非素数(a.k.a复合数。)当n大于列表中最大数字的平方根时,你就停止了。每个仍然标记为素数的数字都是素数!
在构建列表和筛子时可以跳过偶数,但这有点复杂。
答案 1 :(得分:0)
我编写了一个函数,用于Project Euler问题,这可能比Broseph的解决方案更清晰一些,并且随着时间的推移积累素数(如果你使用python3更改xrange - >范围)。
primes(maxp):
"""
Returns a list of all primes < maxp.
"""
sieve = [True for x in xrange(maxp)]
prime_lst = [1]
for i in xrange(2, int(sqrt(maxp))):
if sieve[i]:
prime_lst.append(i)
for j in xrange(2*i, maxp, i):
sieve[j] = False
return prime_lst