| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2218 人关注过本帖
标题:求最大公约数 为什么最后输出的是无限的循环?
只看楼主 加入收藏
意林林
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2015-12-29
收藏
得分:0 
回复 8楼 wmf2014
因为我还是初学者,所以很多细节还不是很注意
谢谢你的提醒  以后会注意的。。
2016-01-01 12:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用wmf2014在2015-12-31 11:12:21的发言:

另:为提高循环效率,在for语句的循环条件里固定值的判断最好不要用算式,因为每次循环判断时都做运算,极大降低效率,如下几例均红色部分均不可取:
for(i=0;i<a*b;i++)  //a、b值已经固定,并且在循环里不再改变,类似的二楼w版主的c<=((a>b)?a:b)固定值的二目运算也是不可取的
for(i=0;i<=sqrt(n);i++) //这个循环再找素数里常用,貌似找到sqrt(n)位置减少了循环次数,但其实每次都调用开方函数和进行类型转换,相反降低循环效率


第一行,對編譯器能推斷出a、b均爲常數的情形,編譯時就直接計算出a*b的常數作替換了,不會降低效率,這是絶大多數編譯器都有的功能。
第二行,因爲是調用函數,所以哪怕是n爲常數,編譯器也祇能老實按函數調用編譯,那真是降低效率的。通常用臨時常變量儲存sqrt(n)的値,再用它循環。

授人以渔,不授人以鱼。
2016-01-01 15:01
叮铃叮铃铛
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-12-10
收藏
得分:0 
我觉得在printf下面加一个break;可以么,这样就只要有适合的解输出并推出不就好了么
2016-01-01 16:18
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 13楼 TonyDeng
看来编译器的优化功能还是很强大的。用两种编译器在我的老本本上实验,从-900000000到900000000空循环,vc在用a*b做循环条件比不用平均慢300毫秒,这种差别在这么多的循环次数里实在不算什么;比较奇葩的是gcc编译器倒行逆施,用a*b做循环条件比不用平均要快1000毫秒,也即代码执行效率提高了
实验用代码及运行效果图如下:
程序代码:
#include <stdio.h>
#include <time.h>
void main()
{
    int i,j,a,b,n;
    long t1,t2;
    a=b=30000;
    j=a*b;
    for(n=0; n<5; n++)
    {
        t1=clock();
        for(i=-j; i<a*b; i++);
        t2=clock();
        printf("a*b...%d,",t2-t1);
        t1=clock();
        for(i=-j; i<j; i++);
        t2=clock();
        printf("j...%d\n",t2-t1);
    }

}
图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2016-1-1 18:35编辑过]


能编个毛线衣吗?
2016-01-01 18:33
快速回复:求最大公约数 为什么最后输出的是无限的循环?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.257497 second(s), 12 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved