https://vjudge.net/problem/HDU-1431
关键: 1.找某个范围内素数的个数,先采用素数打表预处理(就是在输入之前判断好了哪些是素数)效率高,.否则超时,用一标志数组isPrime[i] 记录这个数i是不是素数,为了避免超内存,这个数组是bool类型
2.题目给的范围到了10亿,依然会超内存,怎么缩小这个数组的大小?我们只有自己在机上先跑一遍,然后看10亿里面最大的那个回文素数是多少,然后用那个数来确定isPrime开多大
3.解决超时和超内存问题,这题才可以做。继续努力吧。
#include<stdio.h>
#include<memory.h>
const int maxn = 100000000000;
bool isPrime[maxn];
int prime[1000+100];//记录回文素数
int cnt = 0;//回文素数的个数
int huiwen(int n)//测试是不是回文
{
int tmp = n;
int rs = 0;
while(n>0)
{
rs = rs*10+n%10;
n=n/10;
}
if(rs==tmp)return 1;
return 0;
}
void del()
{
isPrime[1]=1;
isPrime[2]=0;
isPrime[3]=0;
for(int i=2;i<=maxn;i++)//素数打表
{
if(!isPrime[i])//是素数
{
if(huiwen(i))//回文检测
{
prime[cnt++]=i;
}
for(int j=i+i;j<=maxn;j=j+i)
{
isPrime[j]=1; //不是素数
}
}
}
}
int main()
{
int n,m;
memset(isPrime,0,sizeof(isPrime));//0是代表是素质
del();
while(~scanf("%d %d",&n,&m))
{
for(int i=0;i<cnt;i++)
{
if(prime[i]<n)//要在n~m内找素数
{
continue;
}
if(prime[i]>m)
{
break;
}
printf("%d\n",prime[i]);
}
printf("\n");
}
return 0;
}