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