您的位置:首页 > 其它

hdu1431 2138 素数筛法的应用

2013-03-21 15:24 176 查看

hdu 2138 How many prime numbers

/*
2013-03-21 15:10:20    Accepted    2138    15MS    544K    1338 B
筛法就是预先打表处理
任何一个非素数必能转换成若干素数之积
本题根据以上定理给出10以内的素数,然后打一个素数表,
再根据定理求给定的数是否为素数
*/
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
//最大值一定要够大,因为不够大,出现了两次除数为零的错误,囧
const long long  maxn=7*1e4;
int prim[maxn];
//素数打表
void do_prim()
{
memset(prim,0,sizeof(prim));
//存入10以内的素数
prim[0]=2;
prim[1]=3;
prim[2]=5;
prim[3]=7;
int m=4;
for(long long  i=11;i<maxn;i++)
{
long long  k=sqrt((double )i)+1;
int flag=1;
for(int j=0;prim[j]<k;j++)
{
if(i%prim[j]==0)
{
flag=0;
break;
}
}

if(flag)
{
prim[m++]=i;
}
}
}
int main()
{
int n;
do_prim();
while(scanf("%d",&n)!=EOF)
{
int a;
int ans=0;
while(n--)
{
int flag=1;
scanf("%d",&a);
if(a==0||a==1)continue;
int c=sqrt((double)a)+1;
for(int i=0;prim[i]<c;i++)
{
if(a%prim[i]==0)
{
flag=0;
break;
}
}
if(flag)
ans++;
}
printf("%d\n",ans);
}
return 0;
}


hdu1431 素数回文

/*
2013-03-21 14:17:11    Accepted    1431    453MS    10044K    1533 B
写于13年3月21日
练习素数筛法
百度后知道最大的素数回文是9989899,不到10000000
后面的一个0只是摆设
之后打表确实如此,这也为以后做题给了一个提示:
即数据范围过大时,可先打表观察一下预处理
*/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn=10000010;
bool prim[maxn];
char str[15];
void is_prim()
{

memset(prim,1,sizeof(prim));
prim[0]=prim[1]=0;
//循环只需进行到sqrt(maxn)就可以了
for(int i=2;i<3163;i++)
{
if(prim[i])
{
//小与i*i的数据已经在k*i(k<i)时处理过了,不需重复处理
for(int j=i*i;j<maxn;j+=i)
{
prim[j]=0;
}
}
}
}
void huiwei()
{
is_prim();
for(int i=2;i<maxn;i++)
{
if(prim[i])
{
sprintf(str,"%d",i);//将实数i以字符串的形式输入str
int len=strlen(str)-1;
for(int j=0;j<(len+1)/2;j++)
{
if(str[j]!=str[len-j])
{
prim[i]=0;
break;
}
}
}
}
/*
//打表观察素数回文的范围
for(int i=2;i<maxn;i++)
if(prim[i])
printf("%d\n",i);
*/
}
int main()
{
int a,b;
huiwei();
while(scanf("%d%d",&a,&b)!=EOF)
{

for(int i=a;i<maxn&&i<=b;i++)
{
if(prim[i])
printf("%d\n",i);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: