素数回文5到一亿

来源:互联网 发布:算法设计 pdf 编辑:程序博客网 时间:2024/05/17 22:53

除了11外,任意偶数长度的回文都不是素数因为都会被11整除。题目给的范围里最大的回文素数就是9989899。所以数组只要开到这个数就够了,减少了很多数的筛选与数组的空间。

#include<stdio.h>    bool is[9989900]; //如果i是素数,then is[i]=fasle, else is[i]=true; int prime[1000]; //prime用来存回文素数表  void set()//高效判断素数法:所有和数都等于N个素数的乘积{    int i,j;       /*for(i=5;i<=3163;i++)       is[i]=0;      由于bool类型默认值是false,所以可以注释掉*/    i=2;    for(j=i*i;j<=9989899;j+=i)           is[j]=true;     for(i=3;i<=3163;i=i+2)       {           if(is[i])            continue;           for(j=i*i;j<=9989899;j+=i)                is[j]=true;       }   }   bool test(int a)//判断a是不是回文数  {       int temp=a;       int b=0;       while(temp!=0)       {           b=b*10;           b+=temp%10;           temp/=10;       }       return a==b;   }   int main()   {       int a,b;       int i,k=0;       set();       for(i=5;i<=9989899;i+=2)           if(!is[i]&&test(i))               prime[k++]=i;           while(~scanf("%d %d",&a,&b))           {               for(i=0;i<k;i++)               {                   if(prime[i]<a)                       continue;                   else if(prime[i]<=b)                       printf("%d\n",prime[i]);                   else                      break;               }               printf("\n");           }           return 0;   }


原创粉丝点击