0
点赞
收藏
分享

微信扫一扫

hdoj 素数回文 1431 (素数打表&&转换)好题


素数回文

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15876    Accepted Submission(s): 3524



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


//因为数特别大,所以用常规的素数打表,打出p[]数组肯定会超内存(我刚开始就MTL3次T_T),所以要稍微转换一下(只用bool型的pp[]数组来判断素数就行了)。


#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 10000010
using namespace std;
bool pp[N];
int p[1010];
void getp()//筛选素数 
{
	int i,j;
	for(i=2;i<=3500;i++)
	{
		if(pp[i])
			continue;
		for(j=i+i;j<=N;j+=i)
			pp[j]=true;
	}
}
int hw(int n)//判断是否回文 
{
	int m=0,mm=n;
	while(mm)
	{
		m=m*10+mm%10;
		mm/=10;
	}
	if(m==n)
		return 1;
	return 0;
}
int main()
{
	getp();
	int l,r,i,k=0;
	for(i=5;i<=N;i+=2)
	{
		if(!pp[i]&&hw(i))
			p[k++]=i;
	}
	while(scanf("%d%d",&l,&r)!=EOF)
	{
		for(i=0;i<k;i++)
		{
			if(p[i]>=l&&p[i]<=r)
				printf("%d\n",p[i]);
		}
		printf("\n");
	}
	return 0;
}


举报

相关推荐

0 条评论