(1)类型:数学素数。
(2)题目: Description
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0
Input
第一行给出测试数据组数N,
接下来的N行每行有一个整数M,
Output
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。
Sample Input
3
6
8
10
Sample Output
5 1
7 1
11 1
(3)解题思路:这题和一般的素数筛问题没什么区别,初始值n也是很大。利用素数筛就可以降低复杂度了。
(4)时间复杂度:O(n)。
(5)总结:此题唯一有的小巧妙的地方就是距离的计算上,其他没有特别之处。
(6)代码:
#include<iostream>
#include<cstring>
const int MAX_N=1000000+6;
using namespace std;
int isprime[MAX_N+1];
void prime(int n){
memset(isprime,true,sizeof(isprime));
isprime[0]=0;isprime[1]=0;
for(int i=2;i<=MAX_N;i++)
if(isprime[i])
for(int j=2*i;j<n;j+=i)isprime[j]=0;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
int i,T,n;cin>>T;
prime(MAX_N);
while(T--){
cin>>n;
int l1=-1e9,r1=1e9;
for(i=n;i>=2;i--)
if(isprime[i]){l1=i;break;}
for(i=n;i<=1e6+6;i++)
if(isprime[i]){r1=i;break;}
if(n-l1<=r1-n)
cout<<l1<<" "<<n-l1<<endl;
else cout<<r1<<" "<<r1-n<<endl;
}
}