素数筛
1.欧拉筛
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 typedef long long ll; 5 const int MAXN=1000010; 6 const int MAXV=50010; 7 8 ll l,r; 9 bool notprime[MAXN]; //表示i是否质数 10 ll primes[MAXN]; //存储第i个质数 11 int ans=0; 12 13 int cnt=0; 14 void olaPrime() //欧拉筛 15 { 16 for (int i=2;i<MAXV;i++) 17 { 18 if (!notprime[i]) primes[++cnt]=i; 19 for (int j=1;i*primes[j]<MAXV;j++) 20 { 21 notprime[i*primes[j]]=true; 22 if (i%primes[j]==0) break; 23 } 24 } 25 return; 26 } 27 28 int main() 29 { 30 olaPrime(); 31 cin>>l>>r; 32 if (l==1) l=2; //l=1特判 33 for (int i=1;i<MAXN;i++) notprime[i]=false; //init 34 for (int i=1;i<=cnt;i++) //枚举每个素数进行筛选 35 { 36 ll p=primes[i]; 37 ll start=max((l+p-1)/p*p,2*p); //start为大于l且能被p整除的最小的数 38 for (ll j=start;j<=r;j+=p) 39 { 40 notprime[j-l+1]=true; //筛选,区间平移 41 } 42 } 43 for (int i=1;i<=r-l+1;i++) //统计素数个数 44 { 45 if (!notprime[i]) ans++; 46 } 47 cout<<ans<<endl; 48 49 return 0; 50 }
2.埃筛(常用)
1 const int MAXN=100010; 2 bool primes[MAXN]; //表示i是否为质数 3 void aiPrime() 4 { 5 for (int i=2;i<MAXN;i++) primes[i]=true; 6 for (int i=2;i*i<MAXN;i++) //判断改成i*i<MAXN 7 { 8 if (primes[i]) 9 { 10 for (int j=i*i;j<MAXN;j+=i) primes[j]=false; 11 } 12 } 13 return; 14 }