题目描述:给定一个区间,将这个区间里所有既是素数又是回文数的数输出来。

题目分析:这题的这个数据范围比较大,达到了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 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-16
  • 2021-12-09
  • 2022-12-23
  • 2021-11-15
  • 2021-05-31
猜你喜欢
  • 2021-12-08
  • 2021-05-24
  • 2022-12-23
相关资源
相似解决方案