这题是要求a..b范围内既是回文数又是质数的数~~~开始我是先找用筛选法筛素数再来判断范围内的素数是否是回文~~在本题跑大数据就很慢~~10S左右~~交上去试试结果直接是爆空间...后来想了一下~~明显的在一个确定范围内素数的数量比回文数的数量多很多...并且回文数可以直接构造..如有一个数 [ 可以直接就构造一个[ ] 或者 [ ? ] ...就给的b最大到10的八次方..但构造回文时因为每次至少是会变成两倍长度...所以只要构造时是要扫描到10000就够了...构造好回文数后排个序~~再在范围内找是否是质数就行了...很快啊~~最大的也不超过0.1秒...
Program:
/*
ID: zzyzzy12
LANG: C++
TASK: pprime
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
int a,b,s[110001],i,j,num;
int turn(int a)
{
int k=1;
while (k<=a) k*=10;
return k;
}
int change(int a)
{
int k=0;
while (a)
{
k=k*10+a%10;
a/=10;
}
return k;
}
bool ok(int a)
{
int i;
for (i=2;i<=a/i;i++)
if (a%i==0) return false;
return true;
}
int main()
{
freopen("pprime.in","r",stdin);
freopen("pprime.out","w",stdout);
num=0;;
for (i=5;i<=9;i++) s[++num]=i;
for (i=1;i<10000;i++)
{
a=turn(i); b=change(i);
s[++num]=i*a+b;
for (j=0;j<=9;j++) s[++num]=i*a*10+a*j+b;
}
sort(s+1,s+1+num);
scanf("%d%d",&a,&b);
i=1;
while (s[i]<a) i++;
while (s[i]<=b)
{
if (ok(s[i])) printf("%d\n",s[i]);
i++;
}
return 0;
}