题意:求区间[a,b]内所含质数个数。
题解:筛一遍素数,二分查找。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int mr=100001; 6 bool notp[mr]; 7 int pr[mr]; 8 int pn; 9 void getpri()//筛素数 10 { 11 memset(notp,0,sizeof(notp)); 12 for(int i=2; i<mr; i++) 13 { 14 if(!notp[i]) 15 { 16 pr[pn++]=i; 17 } 18 for(int j=0; j<pn && i*pr[j]<mr; j++) 19 { 20 int k=i*pr[j]; 21 notp[k]=1; 22 if(i%pr[j]==0) 23 break; 24 } 25 } 26 } 27 int cac(int x) 28 { 29 if(x<2) 30 return 0; 31 int mid,ll=0,rr=pn-1,ans=0; 32 while(ll<=rr) 33 { 34 mid=(ll+rr)>>1; 35 if(pr[mid]>x) 36 rr=mid-1; 37 else 38 ll=mid+1,ans=mid; 39 } 40 return ans+1; 41 } 42 int main() 43 { 44 pn=0; 45 getpri(); 46 int a,b; 47 while(scanf("%d%d",&a,&b),a!=-1||b!=-1) 48 { 49 printf("%d\n",cac(b)-cac(a-1)); 50 } 51 return 0; 52 }