/* * 程序的版权和版本声明部分: * Copyright (c) 2013,郑州大学SIAS国际学院 * 文件名称: * 作 者: 王 杰 * 完成日期:2013 年 11 月 1 日 * 对任务及求解方法的描述部分: * 输入描述: * 问题描述: * 程序输出: * 问题分析: * 算法设计: */ #include<stdio.h> int prime(int n) { int a=2; //当n为1时好像没有考虑到 while (a<=n) if (!(n%a++)) break; if(a==n+1 && n!=1) return 1; return 0; } int main() { int n; //组数 int x; //测试数据 int z,m; //左边最接近的素数,右边最接近的素数 int ly,lz; //右边的最接近的素数的与x的距离,左边的最接近的素数的与x的距离 int q; //为了保存输入的x的值,在做完向左查找后,初始化x,继续做向右查找 scanf("%d",&n); while(n--){ scanf("%d",&x); q=x; if(x==1) //x=1时的特殊情况,单独列出来 printf("2\n"); else if(prime(x)) printf("%d\n",x); else{ do{ z=--x; if(prime(z)){ lz=q-z; //这里是q-z,不能是x-z break; } } while(1); x=q; //初始化x do{ m=++x; if(prime(m)){ ly=m-q; //这里是m-q,不能是m-x break; } } while(1); if(ly<=lz) printf("%d\n",m); if(ly>lz) printf("%d\n",z); } } return 0; }
运行结果:
总结:第一:求素数自定义了一个prime函数,其实这就是一个同法,只要判断素数,就可以调用这个构造函数;第二:第一次提交时,有点问题,显示时间有点超时,但是细看以后,其实是少考虑了一种情况,即当x=1的时候,就是因为这样可能使程序进入了一个死循环。所以找到原因是,第一想到的解决办法就是 把1给包括进去,但是,自己在函数那块还不是特别精通,不是特别理解函数返回值这一点,所以就又换了另外一种方法,就是把x=1单独列出来,这样问题就解决了。
好好理解,学习学习函数那块!