题目链接
思路分析
一开始想先用欧拉筛筛出所有素数之后在判断是否回文,结果超时。(标准结局) 后来看了下别人的思路,大部分是先自己创造回文数,再判断是否是素数。创造时也有技巧。因为存在一个定理:偶数位回文数除了11外均为合数。这样就可以只创造奇数位回文数来判断。
引理证明
观察偶数位的回文数,提取所有奇数位的数字,与提取所有偶数位的数字,正好是相反的顺序。因此,偶数位数和等于奇数位数和,从而差等于0,从而能被11整除,因此这个回文数一定不是素数。
代码
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
long long rev(long long a)
{
if(a==8) return 11;//11刚好在7后
long long t=a;
t/=10;
while(t>0)
{
a*=10;
a+=t%10;
t/=10;
}
return a;
}
bool p(long long t)
{
if(t==1) return 0;//注意特判
if(t==2) return 1;
for(int i=2;i*i<=t;i++)
{
if(t%i==0) return 0;
}
return 1;
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
for(int i=1;i<=100000;i++)
{
long long tmp=rev(i);
if(tmp>=a&&tmp<=b&&p(tmp)) printf("%d\n",tmp);
}
return 0;
}
当然更快的还可以打表