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