HDU 回文素数

来源:互联网 发布:机车 知乎 编辑:程序博客网 时间:2024/05/19 19:14
Problem Description
xiaoou33对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间满足条件的数。(5 <= a < b <= 100,000,000);

Input
这里有许多组数据,每组包括两组数据a跟b。

Output
对每一组数据,按从小到大输出a,b之间所有满足条件的素数回文数(包括a跟b)每组数据之后空一行。

Sample Input
5 500

Sample Output
5711101131151181191313353373383
---------------------------
思路:很简单,就是,先打一张素数表,然后用普通的方法判断是否是回文的
后来,从别人那里发现,实际上单就回文,素数来讲,回文的数字少,素数较多,
也就是说,可以先判断,回文再判断素数;
不过下面的程序是先判断素数,再判断回文的;
/*回文素数:打表*/#include<stdio.h>#include<math.h>#include<string.h>#define N 100000011int nprime[N];int su[N];int main(){char buff[15];memset(buff,0,sizeof(buff));int limit,le,ri,flag;int i,j,k,start,end,t,len;limit = sqrt(N)+1;nprime[1]=1;for(i=2;i<=limit;i++){if(!nprime[i]){for(j=i*i;j<N;j+=i)nprime[j]=1;}}for(k=5;k<N;k++){if(!nprime[k]){sprintf(buff,"%d",k);len = strlen(buff);if(len==1){su[k]=1;continue;}else if(len==2){if(buff[0]==buff[1])su[k]=1;}else{//flag=1;t = len/2;for(le=t-1,ri=t+1;le>=0&&ri<len;le--,ri++){if(buff[le]==buff[ri])flag=1;else{ flag=0;break;}}if(flag)su[k] = 1;}}}while(scanf("%d%d",&start,&end)!=EOF){for(i=start;i<=end;i++){if(su[i])printf("%d\n",i);}}return 0;}
0 0