#include<stdio.h>
#include<math.h>
int isprime(int m);//方法一
int main()
{
int T;
scanf("%d", &T);
while(T --)
{
int X, i, j;
scanf("%d", &X);
if(isprime(X))
printf("%dn",X);
else
{
for(i = X-1; i > 2; i --)
if(isprime(i))
break;
for(j = X+1; ;j ++)
if(isprime(j))
break;
if(((j - X) <= (X - i)) || i==2)
printf("%dn", j);
else
printf("%dn", i);
}
}
return 0;
}
int isprime(int m)
{
int k, i;
k = (int)sqrt(m);//在此写了一个子函数,对单个的数判断是否是素数;
if(m == 1)return 0;
else if(m == 2)return 1;//开始的时候,这道题没有通过的原因是没有搞清楚素数的概念,0,1不是素数,2是素数;
else
{
for(i = 2; i <= k; i++)//换成for(i = 2; i * i < m; i++)也可以,更符合计算机的思维;
{
if(m % i ==0)
break;
}
if(i >= k+1)
return 1;
else
return 0;
}
}
/*第二种方法:筛选法*/
#include<stdio.h>
int main()
{
int T, i, j;
bool n[2000]={0};//注意,数组开到了2000,开始时是1001,出现“越界”错误;
n[1]=1;//筛选,就是将不是素数的去掉(标记成1),而把剩下的那些“点”(未标记的,素数)选出来;
for(i = 2; i * i < 2000; i ++)
{
if(n[i]==0)
{
j = i;
while((j += i) < 2000)//按倍数标记,效率高;
{
n[j]=1;
}
}
}//应该注意一点,997-1009,只有997,1009是素数;
scanf("%d", &T);
while(T --)
{
int X, i, j;
scanf("%d", &X);
if(n[X]==0)
printf("%dn",X);
else
{
for(i = X-1; i > 2; i --)
{
if(n[i]==0)
break;
}
for(j = X+1; ;j ++)//这里j并没有设置上限;
{
if(n[j]==0)
break;
}
if((j - X) <= (X - i))
printf("%dn", j);
else
printf("%dn", i);
}
}
return 0;
}
/*这是一位很厉害的学长写的,一看就知,水平不一般*/
#include<stdio.h>//只是对continue有点不太明白;
int main()
{
//筛选法
int i, j;
bool prime[1010] = {0};
prime[1] = 1;
for(i = 2; i < 1010; i++)
{
if(!prime[i])
{
for(j = i + i; j < 1010; j += i)
{
prime[j] = 1;
}
}
}
int t;
scanf("%d", &t);
while(t--)
{
int num;
scanf("%d", &num);
int len;
bool left = 1, right = 1;
for(len = 0; len < 1010; len++)//这个方法的思路跟法二差不多,但是更系统更全面;
{
if(right)
{
if(num + len > 1001)
{
right = 0;
continue;
}
if(!prime[num + len])//非0即1(没有被标记);
{
printf("%dn", num + len);
break;//相同距离时,先执行if(right),能找到的话,就跳出
//此时if(left)不会执行,所输出的,正好是最大的那一个。if(right)没找到,而if(left)找到了,也就是找到了距离X最近的素数,正好输出来。
}
}
if(left)
{
if(num + len < 2)
{
left = 0;
continue;
}
if(!prime[num - len])
{
printf("%dn", num - len);
break;
}
}
}
}
return 0;
}
//附:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int num;
bool a[60000001] = {0};
int i, j = 0;
for(i = 2; i * i <60000001; i ++)
{
if(a[i] == 0)
for(j = i+i; j < 60000001;j +=i)
a[j] = 1;
}
while(n --)
{
scanf("%d",&num);
printf("%d\n",a[num] );
}
return 0;
}