代码改变世界

1752. 选择

2011-04-22 01:37  Min·zc  阅读(151)  评论(0编辑  收藏  举报
 1 /*
 2  *筛法求出1000000内的素数,存入prime中,然后二分prime求解
 3  */
 4 
 5 #include <stdio.h>
 6 #include <memory.h>
 7 int prime[5000];
 8 int tem[1000000];
 9 int n;
10 int setprime()
11 {
12         memset(tem,0,sizeof(tem));
13         int k=1;
14         for(int i=2;i<1000000;i++)
15         {
16                 if(tem[i]==0)
17                 {
18                         prime[k++]=i;
19                         for(int j=2;j*i<1000000;j++)
20                                 tem[i*j]=1
21                 }
22         }
23         return k;
24 }
25 int bs(int h, int e)
26 {
27         int mid=(h+e)/2;
28         while(h<=e)
29         {
30                 mid=(h+e)/2;
31         //     printf("%d %d %d %d\n",h,e,prime[mid],mid);
32                 if(prime[mid]>n)
33                         e=mid-1;
34                 else if(prime[mid]<n)
35                         h=mid+1;
36                 else
37                         return mid;
38         }
39         return mid;
40 }
41 int main()
42 {
43         int len=setprime();
44         scanf("%d",&n);
45         while(n!=-1)
46         {
47                 int ans=bs(1,len);
48                 printf("%d\n",ans);
49                 scanf("%d",&n);
50         }
51 }