线性复杂度的素数筛选法
// #include"cstdio" // #include"cstring" // using namespace std; // #define maxn 100000//求maxn范围内的素数 // long long su[maxn],cnt; // bool isprime[maxn]; // void prime() // { // cnt=1; // memset(isprime,1,sizeof(isprime));//初始化认为所有数都为素数 // isprime[0]=isprime[1]=0;//0和1不是素数 // for(long long i=2;i<=maxn;i++) // { // if(isprime[i])//保存素数 // { // su[cnt++]=i; // } // for(long long j=i*2;j<=maxn;j+=i)//素数的倍数都为合数 // { // isprime[j]=0; // } // } // } // int main() // { // prime(); // for(long long i=1;i<cnt;i++) // printf("%d ",su[i]); // return 0; // } #include <bits/stdc++.h> using namespace std; #define maxn 100000//求maxn范围内的素数 long long su[maxn],cnt; bool isprime[maxn]; void prime() { cnt=1; memset(isprime,1,sizeof(isprime));//初始化认为所有数都为素数 isprime[0]=isprime[1]=0;//0和1不是素数 for(long long i=2;i<=maxn;i++) { if(isprime[i]) su[cnt++]=i;//保存素数i //下面这个循环的时间复杂度相比较于maxn可以忽略不计 for(long long j=1;j<cnt&&su[j]*i<maxn;j++) { isprime[su[j]*i]=0;//筛掉小于等于i的素数和i的积构成的合数 } } } int main() { prime(); for(long long i=1;i<cnt;i++) printf("%d ",su[i]); return 0; }
每一个不曾刷题的日子
都是对生命的辜负
从弱小到强大,需要一段时间的沉淀,就是现在了
~buerdepepeqi