Problem 7 : 10001st prime

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 10 001st prime number?


第10001个素数

列出前6个素数,它们分别是2、3、5、7、11和13。我们可以看出,第6个素数是13。

第10,001个素数是多少?


朴素解法:暴力枚举(枚举判断每一个数字是否为素数,然后计数器计数,这里需要用到素数定理)

    素数定理:

                    

    函数得到的结果趋近于x以下素数的个数。就此我们可以大致估算出一个上届

优化算法: 本题我们采用线性筛的方式来筛选素数。 线性筛的时间复杂度为O(N)。

线性筛: 

    首先我们需要考虑为何线性筛的时间复杂度为O(N) 而 素数筛的时间复杂度却是O(logN)。

    对于30这个数字,如果我们采用素数筛,他是2的倍数,又是3的倍数,又是5的倍数,他一共被重复标记了3遍。 而如果我们采用线性筛的话,只标记一次即可。

    线性筛的思想: 如果说素数筛是用素数来标记合数,那么线性筛就是采用合数来标记合数。 假设我们遍历已经到达n的这个数字,那么小于n的数字都是已经筛选出来了,那么需要从第一个素数进行遍历,将n乘以这个素数的数字进行标记,直到n的最小素因子时标记结束。


题目代码

#include <stdio.h>
#include <math.h>
#include <inttypes.h>
#define N 200000
int32_t prime[N];
void getprime(){
    for (int32_t i = 2;i < N;i++){
        if(!prime[i])prime[++prime[0]] = i;
        for(int32_t j=1;j<=prime[0];j++){
            if(i * prime[j] > N)break;
            prime[i*prime[j]] = 1;
            if(i % prime[j] == 0)break;
        }
    }
}
int32_t main(){
    getprime();
    printf("%" PRId32 "\n",prime[10001]);
}

猜你喜欢

转载自blog.csdn.net/Ruger008/article/details/80051313
今日推荐