第N个素数
【问题】 素数就是只能被1和自身整除的正整数。第1个素数是2,第2个素数是3,请编程计算第N个素数。比如 N = 100000
判断一个数是不是素数比较容易实现。
所以,最正常的想法是,找一个素数就扔筐里,直到凑够了数。
如果不想走平常路,就弄个递归玩玩。
def isPrime(x):
for i in range(2,x):
if x % i == 0: return False
return True
def primes(n):
if n == 1: return 2
x = primes(n-1) + 1
while True:
if isPrime(x): return x
x += 1
if __name__ == '__main__':
print(primes(1000))
这思路很好理解。第1个素数是2,如果第n-1个素数是x,那就从x+1 开始探测到第一个素数为所求。
如果想优化一下。判断整除的时候,不用从 2 到 x-1,从 2 到 sqrt(x) 就足够了。
使用递归要注意。python 默认的栈极限是很小的。只有1000,一下就会用光,可以设大点,
如下:
if __name__ == '__main__':
import sys
sys.setrecursionlimit(10000)
print(primes(1000))
这个程序在对大数的时候很慢。十万量级的根本跑不动。
得优化。
判断整除性的时候,只对比它小的素数就行,不用对合数。
把所有已经找到的素数放一个数组里。后面的用就方便了。
def primes(n):
def isPrime(x):
for i in a:
if i * i > x: return True
if x % i == 0: return False
return True
a = [2]
x = 3
while len(a) < n:
if isPrime(x):
a.append(x)
x += 1
return a[-1]
if __name__ == '__main__':
print(primes(100000))
python 的函数可以嵌套,内部的函数可以使用外部函数的局部环境。
这才可以勉强算到十万