算法竞赛模板 回文素数
求a~b之间所有回文素数的方法
先创造出a~b之间的所有回文数,再依次判断是否为素数。
ps:若先找素数再判断回文数会超时!
#include<bits/stdc++.h> using namespace std; int lena,lenb,a,b,num[10]; //获取数的位数 int getlen(int n) { int len=0; while(n) { n/=10; len++; } return len; } //判断素数 int jud(int n) { if(n<a||n>b)return 0; for(int i=2;i*i<=n;i++) if(n%i==0)return 0; return 1; } //幂函数 int p(int a,int n) { int i,sum=1; for(i=1;i<=n;i++)sum*=a; return sum; } //获取字符串的值 int getval(int len) { int sum=0,i; for(i=1;i<=len;i++) sum+=num[i]*p(10,i-1); return sum; } //位数为len的回文数构造 void creat(int len,int pos) { int i,t,hlen=(1+len)/2; for(i=0;i<10;i++) { if(!i&&pos==1)continue; num[pos]=num[len+1-pos]=i; if(pos<hlen) { pos++; creat(len,pos); pos--; } else { t=getval(len); if(jud(t))printf("%d\n",t); } } } void ok(int lena) { int i; memset(num,0,sizeof(num)); for(i=lena;i<=lenb;i++) creat(i,1); } int main() { scanf("%d%d",&a,&b); lena=getlen(a); lenb=getlen(b); ok(lena); return 0; }