题目描述:给定一个区间,将这个区间里所有既是素数又是回文数的数输出来。
题目分析:这题的这个数据范围比较大,达到了10^8级别,而且输入的数据有多组,又因为判断一个数是否是回文数貌似只有暴力判断,时间限制是1000ms,所以如果对于每组数据输入都暴力判断的话,应该就TLE了,那么我们该怎么办呢。我们想到回文数本来就不多,再加上还必须要是素数,猜想数据范围虽然非常大,但是在这个区间里面满足条件的数应该不多,我算了一下,只有700多个,所以我们很自然地想到用离线打表,将这个区间内所有的满足条件的数存到一个数组里面去,然后输出的时候判断每一个数是否在输入的这个区间里面就可以了。
先给出本地打表代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<math.h> 4 const int SIZE = 100000005; 5 bool prim[SIZE]; 6 void dabiao() { //先打素数表 7 memset(prim,0,sizeof(prim)); 8 for(int i = 4;i<=SIZE;i+=2) 9 prim[i] = 1; 10 int d = sqrt(SIZE); 11 for(int i = 2;i<d;++i) { 12 if(prim[i]) 13 continue; 14 for(int j = i*i;j<SIZE;j+=i) 15 prim[j] = 1; 16 } 17 } 18 bool judge(int k) { //判断是否是回文数 19 int num[100],n = 0; 20 while(k) { 21 num[n++] = k%10; 22 k/=10; 23 } 24 for(int i = 0;i<n;++i) 25 if(num[i] != num[n-i-1]) 26 return false; 27 return true; 28 } 29 int main( ) { 30 int a,b; 31 freopen("file.txt","w",stdout); //将结果输出到文件中 32 dabiao(); 33 int tot = 0; 34 for(int i = 5;i<=SIZE;++i) 35 if(!prim[i]&&judge(i)) 36 printf("%d,",i); 37 return 0; 38 }