hdu1431 2138 素数筛法的应用

hdu 2138     How many prime numbers

 1 /*
 2 2013-03-21 15:10:20    Accepted    2138    15MS    544K    1338 B
 3 筛法就是预先打表处理
 4 任何一个非素数必能转换成若干素数之积
 5 本题根据以上定理给出10以内的素数,然后打一个素数表,
 6 再根据定理求给定的数是否为素数
 7 */
 8 #include <iostream>
 9 #include <stdio.h>
10 #include <string.h>
11 #include <math.h>
12 using namespace std;
13 //最大值一定要够大,因为不够大,出现了两次除数为零的错误,囧
14 const long long  maxn=7*1e4;
15 int prim[maxn];
16 //素数打表
17 void do_prim()
18 {
19     memset(prim,0,sizeof(prim));
20     //存入10以内的素数
21     prim[0]=2;
22     prim[1]=3;
23     prim[2]=5;
24     prim[3]=7;
25     int m=4;
26     for(long long  i=11;i<maxn;i++)
27     {
28         long long  k=sqrt((double )i)+1;
29         int flag=1;
30         for(int j=0;prim[j]<k;j++)
31         {
32             if(i%prim[j]==0)
33             {
34                 flag=0;
35                 break;
36             }
37         }
38 
39         if(flag)
40         {
41             prim[m++]=i;
42         }
43     }
44 }
45 int main()
46 {
47     int n;
48     do_prim();
49     while(scanf("%d",&n)!=EOF)
50     {
51         int a;
52         int ans=0;
53         while(n--)
54         {
55             int flag=1;
56             scanf("%d",&a);
57             if(a==0||a==1)continue;
58             int c=sqrt((double)a)+1;
59             for(int i=0;prim[i]<c;i++)
60             {
61                 if(a%prim[i]==0)
62                 {
63                     flag=0;
64                     break;
65                 }
66             }
67             if(flag)
68                 ans++;
69         }
70        printf("%d\n",ans);
71     }
72     return 0;
73 }


 

hdu1431 素数回文

 1 /*
 2 2013-03-21 14:17:11    Accepted    1431    453MS    10044K    1533 B
 3 写于13年3月21日
 4 练习素数筛法
 5 百度后知道最大的素数回文是9989899,不到10000000
 6 后面的一个0只是摆设
 7 之后打表确实如此,这也为以后做题给了一个提示:
 8 即数据范围过大时,可先打表观察一下预处理
 9 */
10 #include <iostream>
11 #include <stdio.h>
12 #include <string.h>
13 using namespace std;
14 const int maxn=10000010;
15 bool prim[maxn];
16 char str[15];
17 void is_prim()
18 {
19 
20     memset(prim,1,sizeof(prim));
21     prim[0]=prim[1]=0;
22     //循环只需进行到sqrt(maxn)就可以了
23     for(int i=2;i<3163;i++)
24     {
25         if(prim[i])
26         {
27             //小与i*i的数据已经在k*i(k<i)时处理过了,不需重复处理
28             for(int j=i*i;j<maxn;j+=i)
29             {
30                 prim[j]=0;
31             }
32         }
33     }
34 }
35 void huiwei()
36 {
37     is_prim();
38     for(int i=2;i<maxn;i++)
39     {
40         if(prim[i])
41         {
42             sprintf(str,"%d",i);//将实数i以字符串的形式输入str
43             int len=strlen(str)-1;
44             for(int j=0;j<(len+1)/2;j++)
45             {
46                 if(str[j]!=str[len-j])
47                 {
48                     prim[i]=0;
49                     break;
50                 }
51             }
52         }
53     }
54     /*
55     //打表观察素数回文的范围
56     for(int i=2;i<maxn;i++)
57         if(prim[i])
58            printf("%d\n",i);
59     */
60 }
61 int main()
62 {
63     int a,b;
64     huiwei();
65     while(scanf("%d%d",&a,&b)!=EOF)
66     {
67 
68         for(int i=a;i<maxn&&i<=b;i++)
69         {
70             if(prim[i])
71                 printf("%d\n",i);
72         }
73         printf("\n");
74     }
75     return 0;
76 }

 

 

posted on 2013-03-21 15:24  行者1992  阅读(300)  评论(0编辑  收藏  举报