素数一般筛法(埃拉托斯特尼筛法)

2018-03-30  本文已影响0人  myleosu

将bool数组设为true,bool[0],bool[1]设为false,然后从2开始,每找到一个素数就将它的倍数筛为false。从2一直筛到MAXN的开平方数即可。(埃拉托斯特尼筛法比较好理解,不理解可以自行百度百科,但这种筛法会重复筛选,所以效率不是最高的)
附上代码

#include <iostream>//求第1226564个素数
#include <cstring>
#define MAXN 100000000
#define t 1226564
using namespace std;
bool flag[MAXN];
int num[MAXN];
int cnt = 1;
void temp(){
    flag[0] = false;//0不是素数
    flag[1] = false;//1不是素数
    for(int i = 2;i*i<MAXN;i++){//i*i大于MAXN的时候即可退出
        if(flag[i]){
            for(int j = i;i*j<MAXN;j++)
                flag[i*j] = false;
        }
    }
    for(int i = 1;i<MAXN;i++)
        if(flag[i])
            num[cnt++] = i;
}
int main()
{
    memset(flag,true,sizeof(flag));
    temp();
    cout<<"第"<<t<<"个素数为:"<<num[t];
    return 0;
}

上一篇下一篇

猜你喜欢

热点阅读