除了11外,任意偶数长度的回文都不是素数因为都会被11整除。题目给的范围里最大的回文素数就是9989899。所以数组只要开到这个数就够了,减少了很多数的筛选与数组的空间。
#include<stdio.h>
bool is[9989900]; //如果i是素数,then is[i]=fasle, else is[i]=true;
int prime[1000]; //prime用来存回文素数表
void set()//高效判断素数法:所有和数都等于N个素数的乘积
{
int i,j;
/*for(i=5;i<=3163;i++)
is[i]=0;
由于bool类型默认值是false,所以可以注释掉*/
i=2;
for(j=i*i;j<=9989899;j+=i)
is[j]=true;
for(i=3;i<=3163;i=i+2)
{
if(is[i])
continue;
for(j=i*i;j<=9989899;j+=i)
is[j]=true;
}
}
bool test(int a)//判断a是不是回文数
{
int temp=a;
int b=0;
while(temp!=0)
{
b=b*10;
b+=temp%10;
temp/=10;
}
return a==b;
}
int main()
{
int a,b;
int i,k=0;
set();
for(i=5;i<=9989899;i+=2)
if(!is[i]&&test(i))
prime[k++]=i;
while(~scanf("%d %d",&a,&b))
{
for(i=0;i<k;i++)
{
if(prime[i]<a)
continue;
else if(prime[i]<=b)
printf("%d\n",prime[i]);
else
break;
}
printf("\n");
}
return 0;
}