输入a,b输出[a,b)之间存在多少个素数
猛一看很简单,只需要从a至b挨个判断就行,但是如果ab比较大呢?
这个时候就需要用到埃氏筛法了,具体而言就是从2出发,将所有2的倍数标记为1也就表示此数不为素数,然后从2往上所有标记不为0的都是素数,再用此素数将其所有倍数标记为1,最后只需要统计其标记不为1的数的个数就可以了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
ll a,b;
ll book[200000000]={0}; //book[i]中,其值若为0则表示i为素数,否则i为非素数
ll sum1=0;
int main(){
cin>>a>>b;
for(ll i=2;i<b;i++){
if(book[i]==0){ //判断i是否为素数
ll j=2;
while(i*j<b){ //若是将其所有倍数标记为非素数
book[i*j]=1;
j++;
}
if(i>=a)sum1++;
}
}
cout<<sum1<<endl;
return 0;
}