Problem 7 : 10001st prime
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 10001st prime number?
1. 第7个问题:第10001个质数
通过列出前六个质数:2,3,5,7,11和13,我们可以知道第6个质数是13。
第10001个质数是什么?
2. 求解分析
这道题需要判断质数,还有需要知道每个质数的顺序或者根据顺序号求质数。
因为要判断的质数并不是非常多,我们不一定要使用质数筛子。
3. C++ 代码实现
我们还是使用传统的方法逐个判断质数,如果达到序号就停止继续寻找下一个质数。
函数checkPrime()用来判断一个数是否为质数。
函数getPrimeBySeq()根据序号找到质数。
C++ 代码
#include <iostream>
#include <cassert> // assert()
#include <cmath> // sqrt()
using namespace std;
class PE0007
{
private:
bool checkPrime(long int number);
public:
long int getPrimeBySeq(int seq);
};
bool PE0007::checkPrime(long int number)
{
if (number < 2 || number > 3 && number % 2 == 0)
{
return false;
}
double squareRoot = sqrt((double)number);
for(long int i=3;i<=(long int)squareRoot;i+=2) // 3, 5, 7, ...
{
if (number % i == 0)
{
return false;
}
}
return true;
}
long int PE0007::getPrimeBySeq(int seq)
{
int i = 2; // 1st prime is 2 and 2nd prime is 3
long int number = 3; // other primes are odd starting from 3
while (i < seq)
{
number += 2; // next number
if (true == checkPrime(number))
{
i++;
}
}
return number;
}
int main()
{
PE0007 pe0007;
assert(13 == pe0007.getPrimeBySeq(6));
cout << "The 10001 prime number is " << pe0007.getPrimeBySeq(10001) << endl;
return 0;
}
4. Python 代码实现
Python实现采用两种不同的方法:第一种方法跟C++一样的,第二种方法是先通过质数筛子的方法得到100万以内的质数,然后根据序号从质数列表中得到质数。
Python 代码 (1)
def checkPrime(x):
if (x < 2) or (x != 2 and x%2 == 0):
return False
for i in range (3, int(x**0.5)+1, 2):
if 0 == x % i:
return False
return True
def getPrimeBySeq(seqNo):
number, numOfPrimes = 3, 2
while numOfPrimes < seqNo:
number += 2
if True == checkPrime(number):
numOfPrimes += 1
return number
def main():
assert 13 == getPrimeBySeq(6)
print("The 10001th prime number is %d." % getPrimeBySeq(10001))
if __name__ == '__main__':
main()
Python 代码 (2)
def createPrimeSieve(n):
""" create prime sieve """
sieve = [True] * n
sieve[0] = sieve[1] = False
for i in range(2, int(n**0.5)+1):
if True == sieve[i]:
for j in range(i*i, n, i):
sieve[j] = False
return [i for i in range(1, n) if sieve[i]]
def main():
primes_list = createPrimeSieve(10**6)
assert 13 == primes_list[6-1]
print("The 10001th prime number is %d." % primes_list[10001-1])
if __name__ == '__main__':
main()