题意:求区间[a,b]内所含质数个数。

题解:筛一遍素数,二分查找。

View Code
 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 }