欧几里德算法

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

 

转载于:https://www.cnblogs.com/Parallels/p/5950435.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值