NYOJ 24 素数距离问题
//思路:若n不为素数,同时向前和向后找素数(n=1时,单独输出),找到就结束循环
#include <stdio.h>
#define N 1000050
bool prime[N];
void init()//筛选法求素数
{
for(int i=2;i<N;i++)
prime[i] = true;
for(int i=2;i*i<N;i++)
{
if(prime[i])
{
for(int j=i*i;j<N;j+= i)
{
prime[j] = false;
}
}
}
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--)
{
int n,ans;
scanf("%d",&n);
if(n==1)//当n=1时,单独输出
printf("2 1\n");
else
{
int i;//i为距离
if(prime[n])
ans=n,i=0;
else
{
for(i=1;i<50;i++)
{
if(prime[n-i])//向前找素数(两个if语句不能换位置)
{
ans=n-i;
break;
}
if(prime[n+i])//向后找素数
{
ans=n+i;
break;
}
}
}
printf("%d %d\n",ans,i);
}
}
return 0;
}
//以前写的,不够简练
#include <stdio.h>
#include <math.h>
int prime(int m) //素数的判定函数
{
for(int i=2;i<=sqrt(m);i++)
if(m%i==0)
return 0;
return 1;
}
int main()
{
int n,m,i,j,left,right,c;
scanf("%d",&n); //n为测试组数
while(n--)
{
left=0;
right=0;
scanf("%d",&m); //m 为测试数据
if(m==1) //m=1 直接输出
{
c=1;
printf("2 %d\n",c);
}
else if(prime(m)) // m为素数 直接输出
{
c=0;
printf("%d 0\n",m,c);
}
else //否则,left,right分别为向左,向右的计数器
{
for(i=m-1;i>=2;i--)
{
left++;
if(prime(i)) //向左找到一个素数,距离为left
break;
}
for(j=m+1;j>m;j++)
{
right++;
if(prime(j)) //向右找到一个素数,距离为right
break;
}
if(left>right)
printf("%d %d\n",j,right); //left=right,输出left
else
printf("%d %d\n",i,left);
}
}
return 0;
}