征集更简洁写法 (求最大公约数)

这可能是我第一次在自己的Blog里面放上代码,而且还是自己原创的。不是卖弄,只是好奇,想知道有没有更简洁的写法和方式,以及我的代码中存在着什么样的bug(s)。

这是一个求最大公约数的函数的核心部分,i和j表示两个已知数,x作为循环因子在其内部循环,从1开始一直循环到最大的那个数(i或者j),每一次得到的可以同时被i和j整除的那个x存在y里面,然后继续循环直到退出,因此,y最后一次记录的数就应该是i和j的最大公约数(理论上)。

工作间隙仓促帮一个学弟写的,初步测试了一下结果正确,欢迎大家批评指正!

1 while (i >= x || j >= x)
2 {
3     x = (i % x == 0 && j % x == 0? (y = x) + 1 : x + 1;
4 }
posted @ 2006-10-25 18:20 ZeroCool 阅读(596) 评论(8)  编辑 收藏 网摘 所属分类: 程序感悟

  回复  引用  查看    
#1楼 2006-10-26 09:03 | 李静波      
我试着用你的算法写了一个
static int T(int a, int b) {
for (int i = Math.Min(a, b); i > 1; i--)
if (a % i == 0 && b % i == 0) return i;

return 1;
}

关于求最大公约数,用%性能很差。在坚持用%下,上面的算法,在简洁和性能两方面均有一点点提高。

常用的优化算法参考:http://blog.vckbase.com/arong/archive/2004/06/15/458.aspx

另外什么是简洁?比如我用Math.Min算不算简洁?
抬杠一下,如果MS提供了Math.最大公约数 function,则是最简洁的。
  回复  引用    
#2楼 2006-10-26 14:52 | wangzhe.king [未注册用户]
2楼的考虑到了Math.Min所包含的代码了嘛?如果使用这种方式运行的代码行数反倒增加了。相比1楼的代码,这个不算简洁,而且性能方面,我也不敢保证比1楼的强。
不知道你是否觉得我说的有道理。
  回复  引用    
#3楼 2006-10-27 22:17 | ecsoftcn [未注册用户]
对于楼主的算法有点疑问:
1.既然是求最大公约数,为什么你不按照从大到小的顺序循环呢?
2.为什么要while (i >= x || j >= x)?x小于或等于i和j中小的一个不就行了么?

以小的那个数为基数,递减循环,那么第一次取到的值就应该是最大公约数了,循环就可以break了。
t=(i<=j?i:j);
while(x>0){
if(i % x == 0 && j % x == 0){
y=x;
break;
}
x--;
}
可能是我没理解楼主的意思。。。
  回复  引用    
#4楼 2006-10-29 11:42 | thinkpad [未注册用户]
唉,本来我也想说从大到小找来着,被楼上抢先了,下次一定想到就说,不拖上几天了。
  回复  引用  查看    
#5楼 [楼主]2006-10-30 08:09 | ZeroCool      
@ecsoftcn

是的,如果从大到小判断的话,会很快找到答案。不过,正如我的标题,这次我征集的是最简洁写法而非算法。当然,我并非说算法不重要,但我个人认为场景不同,算法效率与空间效率的重要性也各不相同。

对于这样一个简单的功能,仅仅是查找最大公约数,谁能感觉出机器性能的差异呢?所以在这个时候,我个人更追求代码的空间效率而非时间效率。
  回复  引用    
#6楼 2006-10-30 22:02 | 路人甲[匿名] [未注册用户]
请参见MIT版<离散数学>第5版3.3和3.6节.求两个不同时为0的非负整数的最大公因子算法(Euclid算法).
  回复  引用    
#7楼 2008-04-08 12:39 | 路过 [未注册用户]
楼主写的程序可读性太差
  回复  引用    
#8楼 2008-05-06 20:26 | DennisChen [未注册用户]
int max=0,min=0,r=0;
while (r= max%min)
{
max = min;
min = r;
}
printf("最大公约数 = %d\n",min);

from:http://hi.baidu.com/kofeffect/blog/item/bbd8cada1a477edeb6fd48ca.html




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-10-25 18:30 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: