Python:求第n个素数
Python: find the nth prime number
我正在尝试使用 erathostenes 筛法找到第 n 个素数。
是的,我看到了类似的帖子,但我对 this 一段代码有疑问。
一旦找到第 n 个素数,我想停止算法。这是我写的:
def nth_prime(n):
limit = 10**2
pn = 1 #keeps track of how many prime numbers we have found
sieve = range(3, limit, 2)
top = len(sieve)
for si in sieve:
if si:
pn += 1
print pn, si #used to check while coding
if pn == n:
return si #loop breaks when the nth prime is found
else:
bottom = (si*si - 3)/2
if bottom >= top:
break
sieve[bottom::si] = [0] * -((bottom-top)//si)
print nth_prime(11)
不过没用。至少不是我想要的。如果我添加 return filter(None, sieve)[n-2] 它工作正常。但我希望它在第 n 个素数时停止计算。
这是输出:
2 3
3 5
4 7
5 11
None
虽然我希望它会持续到:
...
11 31
如果函数能够正确计算达到 限制 的所有筛子,为什么输出会这样?
Python break
命令 breaks out of loops, not out of tests (if
-else
)。我通过重新设计逻辑以消除 break
命令来使其工作。即,
if bottom < top:
sieve[bottom::si] = [0] * -((bottom-top)//si)
我正在尝试使用 erathostenes 筛法找到第 n 个素数。 是的,我看到了类似的帖子,但我对 this 一段代码有疑问。 一旦找到第 n 个素数,我想停止算法。这是我写的:
def nth_prime(n):
limit = 10**2
pn = 1 #keeps track of how many prime numbers we have found
sieve = range(3, limit, 2)
top = len(sieve)
for si in sieve:
if si:
pn += 1
print pn, si #used to check while coding
if pn == n:
return si #loop breaks when the nth prime is found
else:
bottom = (si*si - 3)/2
if bottom >= top:
break
sieve[bottom::si] = [0] * -((bottom-top)//si)
print nth_prime(11)
不过没用。至少不是我想要的。如果我添加 return filter(None, sieve)[n-2] 它工作正常。但我希望它在第 n 个素数时停止计算。 这是输出:
2 3
3 5
4 7
5 11
None
虽然我希望它会持续到:
...
11 31
如果函数能够正确计算达到 限制 的所有筛子,为什么输出会这样?
Python break
命令 breaks out of loops, not out of tests (if
-else
)。我通过重新设计逻辑以消除 break
命令来使其工作。即,
if bottom < top:
sieve[bottom::si] = [0] * -((bottom-top)//si)