您的位置:首页 > 其它

素数距离问题(水题一个)

2017-10-05 21:28 253 查看
(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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数学
相关文章推荐