第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 的函数可以嵌套,内部的函数可以使用外部函数的局部环境。
这才可以勉强算到十万