<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">题目:求第10001个素数</span>
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13,
we can see that the 6th prime is 13.
What is the 10 001st prime number?
思路:
一,遍历未知的素数,然后进行判断,统计
二,给出素数列表,然后数数
import math
def is_prime(target):
if target < 2:
return False
a = (int)(math.sqrt(target)) + 1
for i in xrange(2, a):
if target % i == 0:
return False
return True
count = 1
curr = 3
limit = 10001
while count < limit:
if is_prime(curr):
count += 1
curr += 2 # 因为是从3开始统计的,而后面,偶数肯定不是素数,所以这里步长为2
print curr - 2 # 因为是进行素数判断后,再后移,所以这里需要减去后移的长度
这里判断素数的函数,还可以利用函数any(iterable),如下:
def is_prime(x):
if x < 2:
return False
elif x == 2:
return True
else:
return not any(x % i == 0 for i in xrange(3, (int)(sqrt(x)) + 1, 2))
函数
any(iterable)
def any( iterable ):
for element in iterable:
if element:
return True
return False
import math
def is_prime(target, prime_list):
if target < 2:
return False
a = (int)(math.sqrt(target)) + 1
for i in prime_list:
if i > a:
return True
if target % i == 0:
return False
return True
primes = [2]
n = 3
while len(primes) < 10001:
if is_prime(n, primes):
primes.append(n)
n += 2
print(primes[-1])
就利用已经得到的素数列表来进行素数判断,这里还有一种方法:
primes = [2]
n = 3
while len(primes) < 10001:
for prime in primes:
if prime ** 2 <= n:
if n % prime == 0:
break
else:
primes.append(n)
break
n += 2
print(primes[-1])
上面列出来的是直接对数进行素数判断
下面给出先救出素数,然后再直接数数
因为计算素数的方式是对列表进行的,所以在计算的时候不方便统计
import math
def create_prime_list(n = 10 ** 6):
other = n % 6
total = n / 6
end = int(math.sqrt(n)) + 1
primelist = [0, 1, 0, 0, 0, 1] * total + [0, 1, 0, 0, 0, 1][:other]
for i in xrange(2, end):
if primelist[i]:
primelist[i*i :: i] = [0] * ((n - i*i - 1) / i + 1)
primelist[0:4] = [0, 0, 1, 1]
return primelist
limit = 10001
numlist = create_prime_list()
index = 0
for i in xrange(1, len(numlist)):
if numlist[i]:
index += 1
if index >= limit:
print index, i
break
这里是需要统计10001个素数,首先需要对计算范围进行初步估算,然后计算素数列表,再进行统计
因为在看论坛的时候,看到有这么些方法,所以在这里整合了一下。