素数筛法

来源:互联网 发布:有声自动阅读软件 编辑:程序博客网 时间:2024/06/16 22:34

原理是为寻找范围内的全部数字设一个标记,标记两种状态,这个数是素数和不是素数,初始化为都是素数,因为可以用memset函数快速初始化为0,可以让0代表是素数,1代表不是素数,每找到一个新的素数就将这个素数的全部的倍数的标记设置为1,在之后的寻找中如果标记为1就跳过,不是的话就是下一个要找的素数,然后循环直到末尾。

时间复杂度为O(nlogn)。

#include<iostream>#include<cstring>#include<vector>using namespace std;const long long MaxN=1000000;bool flag[MaxN];vector<long long> all;void prime(){   memset(flag,0,sizeof(flag));   for(long long i=2;i<MaxN;i++)if(!flag[i]){      all.push_back(i);      for(long long j=i*i;j<MaxN;j+=i)flag[j]=true;   }}int main(){   prime();   for(int i=0;i<all.size();i++)cout<<all[i]<<endl;}