NYOJ 24(素数距离)

 

素数距离问题

时间限制:3000 ms | 内存限制:65535 KB
难度:2
 
描述
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0
 
输入
第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000),
输出
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。
样例输入
3
6
8
10
样例输出
5 1
7 1
11 1
 #include<stdio.h>
#include<string.h>
#include<math.h>
#define N 1500000
bool visit[N];
void prim()
{
	int temp,i,j;
	temp=(int)sqrt(N+0.5);
	memset(visit,0,sizeof(visit));
	for(i=2;i<=temp;i++)
	if(!visit[i])
	{
		for(j=i*i;j<=N;j+=i)
			visit[j]=1;
	}
}
/* 
bool is_prim(int x) 
{  
	int s;
	for(s=2;s<=sqrt(1.0*x);s++) 
		 if(x%s==0)   
			 return false;
	return true;
 }
 */
int main()
{
	prim();
	int T,m;int i,j=0,k; int temp1,temp2;
	scanf("%d",&T); 
	while(T--) 
	{ 
		scanf("%d",&m); 
		 if(m==1)  
		 {  
			 printf("2 1\n");  
			 continue; 
		 } 
		 /*
		 for(i=m;i>1;i--) 
		 {
			 if( is_prim(m))
			 {
				 printf("%d %d\n",m,0);
				 break;
			 }
			 */
			for(j=m;j>=1;j--)
			{
				if(!visit[j])
					temp2=m-j;
				for(k=m+1;;k++)
					if(!visit[k])	
					{
						temp1=k-m;
						break;
					}
				if(!visit[j]&&!visit[k])
				{
					if(temp1>=temp2)
                                                           /*等号表示相同情况下应输出左边的*/

						printf("%d %d\n",j,temp2);
					else
						printf("%d %d\n",k,temp1);
					break;
				}
			}
	}							 
	return 0;
}


                

 

posted @ 2012-06-10 23:41  加拿大小哥哥  阅读(430)  评论(0编辑  收藏  举报