我编写了一个算法,用前1000个素数填充列表。
当我像这样运行它时,它会用一些不是素数的数字填充列表。
def is_prime():
primes = [2]
a = 0
x = 3
while a < 999:
for i in range(2, x):
if (x % i) == 0:
x += 2
break
else:
primes.append(x)
a += 1
x += 2
return primes
print is_prime()
答案 0 :(得分:2)
[为什么这个]需要在for循环中断?
让我引用this tutorial you might want to look at:
循环语句可能有 else 子句;它是在循环通过列表的耗尽(使用for)[...]终止时执行的,但是当循环以 break <终止时不 / strong>声明。
这意味着在您的while
循环
primes.append(x)
a += 1
x += 2
仅当for
- 循环遍历所有i in range(2, x)
并且从未遇到break
时,才会执行。 (这意味着,没有找到x的除数)
如果没有 break
语句,上面的代码将在 while
- 循环的每次迭代中执行。因此,如果没有break
语句,您只需在每次找到x的除数时将2
添加到x
,并在{{1}结束时声明x为素数(请注意,在开始添加range(2, x)
之前,在范围表达式中,它是原始x
)。这似乎适用于小数字,但与检查x是否有任何除数不同。
答案 1 :(得分:0)
您的算法似乎有效。
例如,与更多standard approach:
进行比较def rwh_primes(n):
""" Returns a list of primes < n """
sieve = [True] * n
for i in xrange(3,int(n**0.5)+1,2):
if sieve[i]:
sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1)
return [2] + [i for i in xrange(3,n,2) if sieve[i]]
p0 = is_prime() # OP's code
p1 = rwh_primes(7920)
print p0==p1 # prints True, so the lists are equal