题目的提示已经非常明显了,可以先生成回文数再判断质数,因为生成回文数的复杂度较小。判断质数用了之前学到的那种做法。
其实可以用一些比较优秀的筛质数的方法,再判断回文数。
1 /* 2 ID: Starry21 3 LANG: C++ 4 TASK: numtri 5 */ 6 #include<iostream> 7 #include<string> 8 #include<cstdio> 9 #include<cstring> 10 #include<vector> 11 #include<algorithm> 12 #include<cmath> 13 using namespace std; 14 #define N 1005 15 #define ll long long 16 #define INF 0x3f3f3f3f 17 int a,b; 18 bool pd(int x) 19 { 20 if(x==1) return 0; 21 if(x==2||x==3) return 1; 22 if(x%6!=1&&x%6!=5) return 0; 23 int s=sqrt(x); 24 for(int i=5;i<=s;i+=6) 25 if(x%i==0||x%(i+2)==0) 26 return 0; 27 return 1; 28 } 29 int main() 30 { 31 //freopen("numtri.in","r",stdin); 32 //freopen("numtri.out","w",stdout); 33 scanf("%d %d",&a,&b); 34 if(a<10) 35 { 36 if(a<=2) puts("2"); 37 if(a<=3) puts("3"); 38 if(a<=5) puts("5"); 39 if(a<=7) puts("7"); 40 } 41 if(a<=11) puts("11"); 42 if(a<999) 43 { 44 for(int i=1;i<=9;i+=2) 45 for(int j=0;j<=9;j++) 46 { 47 int t=i*100+j*10+i; 48 if(pd(t)&&a<=t&&t<=b) 49 printf("%d\n",t); 50 } 51 } 52 if(a<99999) 53 { 54 for(int i=1;i<=9;i+=2) 55 for(int j=0;j<=9;j++) 56 for(int k=0;k<=9;k++) 57 { 58 int t=i*10000+j*1000+k*100+j*10+i; 59 if(pd(t)&&a<=t&&t<=b) 60 printf("%d\n",t); 61 } 62 } 63 if(a<9999999) 64 { 65 for(int i=1;i<=9;i+=2) 66 for(int j=0;j<=9;j++) 67 for(int k=0;k<=9;k++) 68 for(int q=0;q<=9;q++) 69 { 70 int t=i*1000000+j*100000+k*10000+q*1000+k*100+j*10+i; 71 if(pd(t)&&a<=t&&t<=b) 72 printf("%d\n",t); 73 } 74 } 75 return 0; 76 }