Prime Palindromes

题目大意:求出区间[a,b]之间的回文质数。 a<=b<=10^8;

 

解题过程:

1.先打个素数表,新学了个 欧拉筛法,是对普通筛法的改进。普通筛法是每找到一个素数,就把它的所有倍数标记成1,那么对于一个合数,它会被它的所有质因数标记一次。那么就浪费了时间(复杂度O(NloglogN))。欧拉筛法的复杂度可以降到O(N),

它的优化在于 找到一个质数的时候,把所有是它的质数倍的数标记成1(搜一遍已经找到的质数),如果某一个质数是它的约数,那么break;见代码:

 1 void generate_prime()
 2 {
 3     int c;
 4     check[1]=1;
 5     for (int i=2;i<=10000;i++)
 6     {
 7         if (!check[i])
 8             prime[++cnt]=i;
 9         for (int j=1;j<=cnt;j++)
10         {
11             c=i*prime[j];
12             if (c>10000)
13                 break;
14             check[c]=true;
15             if (i % prime[j]==0)
16                 break;
17         }
18     }
19 }

 

2.接下来是如何产生回文数,首先0到9必定是,先放到表中。需要分情况考虑:

A.回文数的位数 是偶数。 那么从1到10000枚举回文数的一半,如何产生另一半。

B.回文数的位数 是奇数, 那么先枚举最中间的那个数,然后枚举左边一半,从1到1000;

 

3.最后写个判断质数的函数,把所有符合要求的放入一个表中,排个序输出即可。

posted @ 2014-08-21 12:52  lzw4896s  阅读(165)  评论(0编辑  收藏  举报