素数一般筛法(埃拉托斯特尼筛法)
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;
}