这题与hdu上的1431类似,结合了之前的经验,还是很轻松的a了这题.
第一条件是素数,果断筛选(模版走起),应该没什么问题.
之后就是回文了,简单说说可以优化的地方
1. 5-99内满足题意的数只有5,9,11;因此,我们直接从100开始找.
2. 其次就是偶数位回文数必定能被11整除,被整除之后的数依然回文(但回文数乘以11并不一定是回文数),因此偶数位的数可以直接跳过,我们直接把奇数位的回文数乘以11,再判断得到的数是否回文,这样就节省了很多的时间.
3 题目范围是5到10的八次方,但实际上10的7次方以上就没有满足题意的数了,因此判断到10的7次方直接break
#include<iostream>
#include<cstdio>
using namespace std;
#define pr 11000000
int u[pr]={0};
void prime()
{
int i,j;
u[0]=1,u[1]=1;
for(i=2;i<pr;i++)
{
if(!u[i])
{
for(j=2;i*j<pr;j++){u[i*j]=1;}
}
}
}
/*int numtest(int x)
{
int sum=0;
while(x>0)
{
sum++;
x/=10;
}
return sum%2==0? 1:0;
}*/
int backtest(int x)
{
int n=0,m=x;
while(m)
{
n=n*10+m%10;
m/=10;
}
return n==x? 1:0;
}
void backstr()
{
u[5]=2;
u[7]=2;
u[11]=2;
int i;
for(i=100;i<=10000000;i++)
{
if(i==1000||i==100000)//1000-100000与1000000-10000000都是偶数位,所以直接跳过
{
i*=10;
continue;
}
if(!u[i]&&backtest(i))
{
u[i]=2;
if(i*11<10000000&&!u[i*11]&&backtest(i*11))
{
u[i*11]=2;
}
}
}
}
int main()
{
cin.sync_with_stdio(false);
prime();
backstr();
int x,y;
scanf("%d%d",&x,&y);
int i;
for(i=x;i<=y;i++)
{
if(i>=pr-1){break;}
if(u[i]==2)
{
printf("%d\n",i);
}
}
return 0;
}