标签:
欧几里德算法,又叫辗转相除法,最初见于东汉出现的《九章算术》,被用来求两个整数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