http://acm.hdu.edu.cn/showproblem.php?pid=1431
这道题,我也就特么错了27次而已!!
主要用到筛法计算素数。
27次错出不少经验:1.bool prime[];标记是否为素数时要用bool,别用int,bool只占一个字节,用int超内存。
2.先判断是否是回文,再判断是否是素数!否者超时。
3.由大神打表可知,10^7~10^8之间没有素数回文数,也就是说计算的时候只要算到10^7就可以了,也就是最大的回文素数就是9989899,所以数组只要开到这个数就够了。但是!即使最大回文是9989899,也要对比它大的数字进行判断!!!!
#include"stdio.h" #include"stdlib.h" #include"math.h" #include"string.h" bool prime[9989900]; int huiwen(int n) { int temp=n; int m=0; while(temp) { m=m*10; m+=temp%10; temp=temp/10; } if(n==m) return 1; else return 0; } void IsPrime() { int i,j,t; memset(prime,true,sizeof(prime)); prime[0]=prime[1]=false; prime[2]=true; prime[3]=true; for(i=4;i<=9989899;i+=2) prime[i]=false; for(i=3;i<=3163;i++) if(prime[i]) for(j=i*i;j<=9989899;j+=2*i) prime[j]=false; } int main() { int a,b,i; IsPrime(); while(scanf("%d%d",&a,&b)!=EOF) { for(i=a;i<=b;i++) { if(i>9989899) continue; if(huiwen(i)&&prime[i]) printf("%d ",i); } printf(" "); } }