这题是要求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; }