#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;}