hdu 1431 素数回文(打素数表)

https://vjudge.net/problem/HDU-1431

关键: 1.找某个范围内素数的个数,先采用素数打表预处理(就是在输入之前判断好了哪些是素数)效率高,.否则超时,用一标志数组isPrime[i] 记录这个数i是不是素数,为了避免超内存,这个数组是bool类型

          2.题目给的范围到了10亿,依然会超内存,怎么缩小这个数组的大小?我们只有自己在机上先跑一遍,然后看10亿里面最大的那个回文素数是多少,然后用那个数来确定isPrime开多大

         3.解决超时和超内存问题,这题才可以做。继续努力吧。

#include<stdio.h>
#include<memory.h> 
const int maxn = 100000000000;
bool isPrime[maxn];
int prime[1000+100];//记录回文素数
int cnt = 0;//回文素数的个数 
int huiwen(int n)//测试是不是回文 
{
	int tmp = n;
	int rs = 0;
	while(n>0)
	{
		rs = rs*10+n%10;
		n=n/10;
	}
	if(rs==tmp)return 1;
	return 0;
}
void del()
{
	isPrime[1]=1;
	isPrime[2]=0;
	isPrime[3]=0;
	for(int i=2;i<=maxn;i++)//素数打表 
	{
		if(!isPrime[i])//是素数 
		{
			if(huiwen(i))//回文检测
			{
				prime[cnt++]=i;	
			}
			
			for(int j=i+i;j<=maxn;j=j+i)
			{
				isPrime[j]=1;	//不是素数 
			}	
		}	
	} 
}
int main()
{
	int n,m;
	memset(isPrime,0,sizeof(isPrime));//0是代表是素质  
	del();
	while(~scanf("%d %d",&n,&m))
	{
		for(int i=0;i<cnt;i++)
		{
			if(prime[i]<n)//要在n~m内找素数
			{
				continue;
			}
			if(prime[i]>m)
			{
				break;
			}
			printf("%d\n",prime[i]);
		}
		printf("\n");
	}
	return 0;
}


       

猜你喜欢

转载自blog.csdn.net/zark721/article/details/78974059
今日推荐