现在的位置: 首页 > 综合 > 正文

南阳理工OJ_素数距离问题

2014年05月20日 ⁄ 综合 ⁄ 共 1220字 ⁄ 字号 评论关闭
/*  
* 程序的版权和版本声明部分:  
* Copyright (c) 2013,郑州大学SIAS国际学院    
* 作    者:  王  杰
* 完成日期:2013 年 11 月 9 日  
*  
* 对任务及求解方法的描述部分:
* 输入描述: 略或见注释、总结
* 问题描述: 略或见注释、总结
* 程序输出: 略或见注释、总结
* 问题分析: 略或见注释、总结
* 算法设计: 略或见注释、总结
*/

#include<stdio.h>  

int prime(int n)
{
	int i;
	if(n<2) return 0;
	for(i=2;i*i<=n;i++)
		if(n%i==0) return 0;
	return 1;
}
 
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 1\n");        
        else if(prime(x))  
            printf("%d 0\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(lz<=ly)  
            printf("%d %d\n",z,lz);  
        else  
            printf("%d %d\n",m,ly);     
        }  
          
    }  
    return 0;  
}

运行结果:

总结:第一次碰见超时问题。自定义的函数效率有点低,后来改进了一下,提高了效率,问题就解决了。恩,这次最大的感受就是程序的效率问题很重要!

附上代码对比一下:

//效率较低的:
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 prime(int n)
{
	int i;                     
	if(n<2) return 0;          //n为1时考虑到了
	for(i=2;i*i<=n;i++)
		if(n%i==0) return 0;
	return 1;
}
//效率更高一点的:
#include<math.h>
int prime(int n)
{
	int mMax=sqrt(n);
	for(int i=2;i<=mMax;i++)
		if(n % i==0) return false;
	return true; 
}

现在才是有了一种体会:程序的效率真的很重要,比如:上面的函数,如果测试数据较大,比如是十亿级别的,程序就得反应几秒钟(3秒左右吧);下面的函数,同样是十亿级别的,反应时间人基本上感觉不到。这就是程序的效率问题!

【上篇】
【下篇】

抱歉!评论已关闭.