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 }