码迷,mamicode.com
首页 > 编程语言 > 详细

欧几里德算法

时间:2016-10-11 20:52:38      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

    欧几里德算法,又叫辗转相除法,最初见于东汉出现的《九章算术》,被用来求两个整数a,b的最大公约数,下面我们来介绍这个算法的原理和用法。

  算法原理:设我们要求整数(a,b)的公约数为x,不妨设a>=b。

  因为x为a和b的公约数,同时a可以表示为a=k*b+r,即r=a-k*b,那么我们很容易看出x也是r的公约数;记  r = a mod b。

  反之,如果我们知道 x 是 b,a mod b的公约数,将上式做简单变换得:a = k * b + r,那么由此可知 x 也是 a,b 的公约数。

  到这里我们得到了一个结论:(a,b)的公约数和( b,a mod b)的公约数是一样的,那么它们的最大公约数也必然相等,同理,将b当做新的a ,将a mod b当做新的b带入上述公式可以得到(b,b mod (a mod b)),这个与(a,b)的最大公约数也是相等的,同理可以将得到的数再当做新的(a,b)再次带入,这样数据规模就会不断缩小,但是最大公约数是不变的,始终与(a,b)的最大公约数相等。那么这样做到什么时候是个头呢?当然是到一个数为另一个数的整数倍,那么它们的最大公约数就是二者较小的那个数,此时a mod b = 0,那么下一步输入的两个数就是(b,0),返回此时输入的第一个数就好了。

  代码实现:C++

  递归方法:

  int gcd(int a,int b){ return b ? gcd(b,a%b):a;}  //这里的a要大于b且不能为0,否则无法跳出函数,一直递归下去会导致爆栈,a,b不能为0

 

  循环方法:

 int gcd(int a,int b) {int t; if(a<b) {t=a;a=b;b=t;} t=a%b; a=b; b=t; while(t) { t=a%b; a=b; b=t;} return a; }       //a,b不能为0

  时间复杂度:准确说是5*lg(n),但平时我们可以按照2*log(n)来计算

  到这里,欧几里德算法就介绍完了,接下来将继续以它为基础学习扩展欧几里德算法及应用。

 

  这是博主写的第一篇文章呢,很简单也很基础,接下来还会写一些其他的算法和题目的题解,如果大家有什么问题或建议,欢迎给我留言,也可以加我QQ:3218558035 与我交流哦

 

欧几里德算法

标签:

原文地址:http://www.cnblogs.com/Parallels/p/5950435.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!