文章标题

来源:互联网 发布:手机自动关闭数据连接 编辑:程序博客网 时间:2024/06/03 12:27

描述

现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0

输入
第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000),
输出
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。


样例输入
3
6
8
10


样例输出
5 1
7 1
11 1

此代码的缺点是耗时有点长,可以写一个函数判断是否是素数,如果本身是素数,直接输出本身,输出0。

include<iostream>
include<stdio.h>
include<cmath>
using namespace std;
int main()
{
int a,b,c;
cin>>a;
while(a--)
{
int i,j,n,m,x,y;
cin>>b;
if(b==1)//1和2我这里是单独判断
{
printf("2 1\n");
}
else if(b==2)
{
printf("2 0\n");
}
else
{
for(i=b;;i++)//先判断比右边的数,找出离b最近的素数
{
for(j=2;j<=sqrt(i);j++)
{
if(i%j==0)//当余数为0时,说明不是素数,则跳出判断下一个数
{
break;
}
}
if(j>sqrt(i))//此时的情况是i除以小于或等于sqrt(i)的数余数都不为0,说明该数是质数,则记住距离,跳出循环
{
x=i-b;
break;
}
}
for(m=b;m>1;m--)\\再判断左边的数,因为最小素数为2,所以判断条件要大于1
{
for(n=2;n<=sqrt(m);n++)//同上
{
if(m%n==0)\\同上
{
break;
}
}
if(n>sqrt(m))\\同上
{
y=b-m;
break;
}
}
if(x<y)\\如果右边得距离小于左边,就输出右边的数
{
cout<<i<<" "<<x<<endl;
}
else\\如果左边小于或等于就输出左边
{
cout<<m<<" "<<y<<endl;
}
}
}
return 0;
}

原创粉丝点击