思路
这道题的难点在于对边界情况的考虑:
- 当num为1时,即数字的左边没有找到素数,直接输出右边最近的素数
代码如下:
#include <iostream>
#include <stdio.h>
using namespace std;
bool isPrime(unsigned long n) //判断是否为素数的函数
{
if(n<=1)
{
return false;
}
else
{
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
return false;
}
}
return true;
}
}
int main()
{
int n;
scanf("%d",&n);
while (n--)
{
int pri;
scanf("%d",&pri);
int i = pri;
int j = pri;
if (isPrime(pri)) //判断数字本身是否为素数
{
printf("%d %d\n", pri,0);
}
else
{
while (!isPrime(i) && i>0) //找数字左边最近的素数
{
i--;
}
while (!isPrime(j)) //找数字右边最近的素数
{
j++;
}
int up = j - pri;
int down = pri - i;
if (i == 0) //边界情况:左边没找到素数
{
printf("%d %d\n",j,up);
}
else
if (up >= down)
{
printf("%d %d\n",i,down);
}
else
printf("%d %d\n",j,up);
}
}
}