HDU 回文素数

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
5 7 11 101 131 151 181 191 313 353 373 383
---------------------------
思路:很简单,就是,先打一张素数表,然后用普通的方法判断是否是回文的
后来,从别人那里发现,实际上单就回文,素数来讲,回文的数字少,素数较多,
也就是说,可以先判断,回文再判断素数;
不过下面的程序是先判断素数,再判断回文的;
/* 回文素数:打表 */ #include<stdio.h> #include<math.h> #include<string.h> #define N 100000011 int 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; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值