关于欧几里得算法和Stein算法

来源:互联网 发布:淘宝cf刷枪是真的吗 编辑:程序博客网 时间:2024/05/04 10:56

最近慢慢复习以前半懂半不懂的东西,关于最大公约数和最小公倍数的问题,是一个很经典的问题,之所以说是一个,是因为最小公倍数就是的求法其实就是求最大公约数,求最大公约数的算法主要有两种,欧几里得算法和Stein算法。
欧几里得算法也就是辗转相除法,这个其实就是我们小学还是初中的时候学的那个,btw,最近越来越发现越是以前习以为常的东西越是美丽,比如最基本的四则运算里面乘除法,运算的方法,如果一点点去看真的很令人着迷。
说回来,欧几里得算法很简单(下面设A大于B):
int A,B;
While(B!=0){
int t = B;
B = A%B;
A = t;
}
return A;
最后得到的A就是最大公约数,这里的做法的实际其实也只是不断缩小两个数而已,如果想不明白可以看我的另外的一篇博客。
然后就是最小公倍数的问题了(还是以AB为例)
最小公倍数就是(A*B)/gcb(A,B),这里的gcb就是最大公约数的意思,其实这里可以很容易看出来,比如,3和4的最小公倍数是12,那么6和8的呢?只是将12乘上放大倍数而已,所谓的最大公约数就是这个放大倍数,因为两边都可以整除完。

欧几里得算法说完了,那么我们来说说Stein算法,因为欧几里得算法算的时候是用的取余,也就是除法,当数很大的时候就显得不太好了,因为大家都知道的这个效率不怎么高,于是就有了Stein算法的出现,它把除法转化成了移位。
具体来说,Stein算法其实是分类减小的思想,和欧几里得算法其实差不太多,就是怎么缩小那两个数而已,它分了三种情况
一种是两个都是偶数的情况,这个时候的做法是将这两个数都减半,它那么这个时候就和之前的6和8道理差不多,现在要求6和8的最大公约数,那么其实求到3和4的最大公约数再乘上2就好了。
第二种是一个奇数一个偶数的情况,这种情况只将偶数减半就好,因为最大公约数肯定是奇数。
第三种情况是两个都是奇数的情况,这个时候其实我是想用A-B和B来减小这两个数的,就是我求A-B和B(两个数中小的那个)的最大公约数。其实官方的做法是求(A+B)/2,(A-B)/2的最大公约数,好吧,,其实都是可以的。至于为什么(A-B)/2可以呢,要证明起来也挺麻烦的,我就偷懒不写了。

0 1
原创粉丝点击