http://acm.nyist.net/JudgeOnline/problem.php?pid=24
方法一
#include<stdio.h>
int isPrime(int num)
{
if(num==1)return 0;
for(int i=2;i*i<=num;i++)
if(num%i==0)
return 0;
return 1;
}
int main()
{
int n,num,numUp,numDown,deltUp,deltDown;
scanf("%d",&n);
while(n--)
{
scanf("%d",&num);
if(isPrime(num))//本身是素数,后面就不用了
printf("%d 0\n",num);
else
{
numUp=numDown=num;
while(!isPrime(numUp))
{
numUp+=1;
}
while(!isPrime(numDown)&&numDown>0)//边界条件,否则不能通过
{
numDown-=1;
}
deltUp = numUp-num;
deltDown = num-numDown;
if(numDown==0)//特殊情况:左边没有找到
printf("%d %d\n",numUp,deltUp);
else if(deltUp>=deltDown)//输出距离小的, 相等则左
printf("%d %d\n",numDown,deltDown);
else
printf("%d %d\n",numUp,deltUp);
}
}
return 0;
}
方法二
#include<stdio.h>
#include<string.h>
#define max 1000000
int a[max+100];
int main()
{
int i,j;
memset(a,0,sizeof(a));
a[1]=1;
for(i=2;i<=max+10;++i)//这个地方把我坑了,max+10
{
for(j=2*i;j<=max+10;j+=i)
{
a[j]=1;
}
}
int t;
scanf("%d",&t);
int m;
while(t--)
{
int temp1,temp2;
scanf("%d",&m);
temp1=temp2=m;
if(a[m]==0)
printf("%d 0\n",m);
else
{
int left,right;
while(a[temp1]==1)
{
++temp1;
}
while(a[temp2]==1&&temp2>0)
{
--temp2;
}
left=m-temp2;
right=temp1-m;
if(temp2==0)
printf("%d %d\n",temp1,right);
else if(left<=right)
printf("%d %d\n",temp2,left);
else
printf("%d %d\n",temp1,right);
}
}
return 0;
}