水题(素数表)NYOJ素数距离

            描述
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0
输入
第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000),
输出
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。
样例输入
3
6
8
10
样例输出
5 1
7 1
11 1

昨天刷题刷得很郁闷,去ACM贴吧逛了一下,发现很多水军,无聊刷了一题……

真心坑,没想到我还WA了一下.因为我打的素数表没有考虑1的情况(我默认是true,导致1输出的是1 0)

#include<iostream>
#include<cstring>
#include"math.h"
using namespace std;
#define N 1300001
bool prime[N];
void init(){
	//打表
	memset(prime,true,sizeof(prime));
   prime[1]=0;
   int sqrtN=sqrt(1.0*N)+1,i;
   for(i=2;i<sqrtN;i++){
	   if(prime[i]){
		
		   for(int j=2*i;j<N;j+=i){
			 prime[j]=false;
	
		   }
		  
	   
	   }
   }
 
}

int main(){
	init();
	int cases,n;
	int lf,rt;
	
	cin>>cases;
	while(cases--){
	   cin>>n;
	   
	   if(prime[n]){cout<<n<<" "<<0<<endl;continue;}
	   lf=rt=1;
	   while(1){
		  
		   if(n-rt>=2){ //真心觉得作者的左跟我的左很不一样。。难道是我喜欢倒数??...取小的
			   if(prime[n-rt]){
			     cout<<n-rt<<" "<<rt<<endl;
			     break;
			   } else rt++;
		        
		   }
		    if(lf+n<N){
			   if(prime[lf+n]==1){
			     cout<<lf+n<<" "<<lf<<endl;
                 break;
			   }else lf++;
		   }
	   
	   }
	
	}
	return 0;

}



posted @ 2014-04-01 09:45  dengyaolong  阅读(117)  评论(0编辑  收藏  举报