hdu 4548(素数打表)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4548

思路:打表什么的没有什么技巧性可言,最后二分的时候得小心返回位置!!!

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 bool mark[1000010];
 6 int num[1000010];
 7 int k;
 8 
 9 int Judge(int n){
10     int ans=0;
11     while(n){
12         ans+=n%10;
13         n/=10;
14     }
15     return ans;
16 }
17     
18 
19 void IsPrime(){
20     memset(mark,true,sizeof(mark));
21     mark[0]=mark[1]=false;
22     k=0;
23     for(int i=2;i*i<1000000;i++){
24         if(mark[i]){
25             for(int j=i*i;j<1000000;j+=i)
26                 mark[j]=false;
27         }
28     }
29     for(int i=2;i<=1000010;i++){
30         if(mark[i]&&mark[Judge(i)]){
31             num[++k]=i;
32         }
33     }
34 }
35 
36 int Binary_Search(int l,int h,int number){
37     while(l<=h){
38         int mid=(l+h)/2;
39         if(num[mid]==number)return mid;
40         else if(num[mid]>number)h=mid-1;
41         else l=mid+1;
42     }
43     return l;
44 }
45 
46     
47 int main(){
48     IsPrime();
49     int _case,n,m,t=1;
50     scanf("%d",&_case);
51     while(_case--){
52         scanf("%d%d",&n,&m);
53         int cnt=0;
54         int pos1=Binary_Search(1,k,n);
55         int pos2=Binary_Search(1,k,m);
56         pos1--;
57         if(num[pos2]==m)pos2++;
58         cnt=pos2-pos1-1;
59         printf("Case #%d: %d\n",t++,cnt);
60     }
61     return 0;
62 }
63         
64     
View Code

 

posted @ 2013-05-18 18:56  ihge2k  阅读(584)  评论(0编辑  收藏  举报