- 描述
- 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出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;
}