Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8099579
  • 博文数量: 159
  • 博客积分: 10424
  • 博客等级: 少将
  • 技术积分: 14615
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-14 12:45
个人简介

啦啦啦~~~

文章分类
文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(10)

2011年(116)

2010年(22)

分类: C/C++

2011-08-25 23:18:09

本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net
  

今天开始重新学习算法,以一个简单的算法题目开始吧。
使用Euclidean算法计算最大公约数。先介绍一下Euclidean算法。下面是来自wiki的介绍
The GCD of two numbers is the largest number that divides both of them without leaving a remainder. The Euclidean algorithm is based on the principle that the greatest common divisor of two numbers does not change if the smaller number is subtracted from the larger number. For example, 21 is the GCD of 252 and 105 (252 = 21 × 12; 105 = 21 × 5); since 252 − 105 = 147, the GCD of 147 and 105 is also 21. Since the larger of the two numbers is reduced, repeating this process gives successively smaller numbers until one of them is zero. When that occurs, the GCD is the remaining nonzero number. 
就是说两个数的最大公约数,等于两数之差与较小数的最大公约数。

下面是C代码的实现
  1. unsigned int get_greatest_common_divisor(unsigned int u, unsigned int v)
  2. {
  3.     unsigned int t;
  4.     while (u > 0) {
  5.         if (u < v) {
  6.             t = u;
  7.             u = v;
  8.             v = t;
  9.         }
  10.         u = u-v;
  11.     }

  12.     return v;
  13. }
在《Algorithms in C》的课后题中,要求计算3个数的最大公约数。这个解答仍然可以通过上面计算两个数的最大公约数的函数来实现。如有abc三个数,分别求出ab的最大公约数d,然后再计算d与c的最大公约数。
  1. unsigned int get_greatest_common_divisor_of_two_num(unsigned int u, unsigned int v)
  2. {
  3.     unsigned int t;
  4.     while (u > 0) {
  5.         if (u < v) {
  6.             t = u;
  7.             u = v;
  8.             v = t;
  9.         }
  10.         u = u-v;
  11.     }

  12.     return v;
  13. }

  14. unsigned int get_greatest_common_divisor_of_three_num(unsigned int x, unsigned int y, unsigned z)
  15. {
  16.     unsigned int a = get_greatest_common_divisor_of_two_num(x, y);
  17.     
  18.     return get_greatest_common_divisor_of_two_num(a, z);
  19. }
在网上还可以搜到一种通过取模来求取GCD的算法,而且也说是Euclid算法。这让我很困惑啊。。。怎么会有两种说法呢?不过还是以英文为主吧。所以还是认为Euclid算法是通过这个减法来求取GCD吧,这个要比取模运算高效。


参考:《Algorithms in C》
阅读(9100) | 评论(18) | 转发(2) |
给主人留下些什么吧!~~

Bean_lee2011-08-27 23:04:09

呵呵是这本,我比较懒,能找到中文的,一般都看中文。这本书我很喜欢,老少咸宜。有机会互相切磋,共同进步

Bean_lee2011-08-27 23:01:18

GFree_Wind: 恭喜你,都会抢答了。正是英文版,现在的好好把算法重新学一遍。毕业以后就没什么机会去做算法相关的事情,基本上都忘光了。虽然毕业后还是会看一些算法书,但是.....
我比较懒,有中文版的就不愿意看英文,两本中文版我都买了。这本书我也很喜欢,作者是高德纳的高徒,讲的通俗易懂,老少咸宜,我经常翻着看。 呵呵怎么成了广告了。

GFree_Wind2011-08-27 22:42:59

Bean_lee: 兄弟看的不会是英文版吧。.....
恭喜你,都会抢答了。正是英文版,现在的好好把算法重新学一遍。毕业以后就没什么机会去做算法相关的事情,基本上都忘光了。虽然毕业后还是会看一些算法书,但是并没有深入的研究。现在可不能这样了,需要好好学习学习。

Bean_lee2011-08-27 21:36:19

兄弟看的不会是英文版吧。

GFree_Wind2011-08-26 22:39:55

warthlanw: 小弟大胆猜测下blacksapper兄的意思:
多个数的时候,例如a,b,c。先求出a,b的最大公约数d,然后就c和d的最大公约数。这样就比文中少一次对基本函数的调用。.....
对。有道理。。。。

不错,我这就改进一下