埃氏筛法
#include<bits/stdc++.h>
using namespace std;
int main(){
int cnt=0;
bool isprime[21];
for(int i=0;i<=20;i++)
isprime[i]=true;
isprime[0]=isprime[1]=false;
for(int i=2;i<=20;i++){
if(isprime[i]){
for(int j=2*i;j<=20;j+=i){
isprime[j]=false;
}
}
if(isprime[i]){
cnt++;
}
}
cout<<cnt;
return 0;
}
#include<bits/stdc++.h>
const int maxn=1e6+7;
using namespace std;
bool isprime[maxn];
void sieve(){
for(int i=0;i<maxn;i++)
isprime[i]=true;
for(int i=2;i<maxn;i++){
if(isprime[i]){
for(int j=2*i;j<maxn;j+=i){
isprime[j]=false;
}
}
}
}
int l,r;
int main(){
sieve();
int cnt=0;
cin>>l>>r;
for(int i=l;i<=r;i++){
if(isprime[i]){
cnt++;
}
}
cout<<cnt;
return 0;
}
区间筛
#include<bits/stdc++.h>
#define LL long long
#define maxn 9999999
using namespace std;
LL a,b;
bool is_prime[maxn];
bool is_prime_small[maxn];
void segment_sieve(LL a,LL b){
for (LL i = 0; i * i < b; i++) is_prime_small[i] = true;
for (LL i = 0; i < b - a; i++) is_prime[i] = true;
for (LL i = 2; i * i < b; i++) {
if (is_prime_small[i]) {
for (LL j = 2*i; j*j < b; j += i) is_prime_small[j] = false;
for (LL j = max(2LL, (a+i-1)/i)*i; j < b; j += i) {
is_prime[j-a] = false;
}
}
}
return;
}
int main(){
cin>>a>>b;
segment_sieve(a,b+1);
int cnt=0;
for(int i=0;i<=b-a;i++){
if(is_prime[i]){
cnt++;
}
}
cout<<cnt;
return 0;
}