更相减损术

据说是数学必修三的内容,(雾)。

部分摘自百度百科:

更相减损术是出自《九章算术》的一种求最大公约数的算法。

原文:可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之

操作:

  1. 任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
  2. 以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。

优化:

  在每次减好之后都对能除2的除2,若2个都能除2,同除2,gcd*2,(我也不知道为什么会快,但数据跑出来就是这样,(求教~~~))

和辗转整除的区别:

更相减损术和辗转相除法的主要区别在于前者所使用的运算是“减”,后者是“除”。

从算法思想上看,两者并没有本质上的区别,

但是在计算过程中,如果遇到一个数很大,另一个数比较小的情况,可能要进行很多次减法才能达到一次除法的效果,

从而使得算法的时间复杂度退化为O(N),其中N是原先的两个数中较大的一个。

相比之下,辗转相除法的时间复杂度稳定于O(logN)。

1 while(1)
2     {
3         if((a.nu[1]%2==0)&&(b.nu[1]%2==0)){a.div2();b.div2();num++;}
4         else if((a.nu[1]%2==0)) a.div2();
5         else if((b.nu[1]%2==0)) b.div2();
6         if(a>b){a=a-b; if(a.z()){while(num--)b.mul2();b.out();break;}}
7         else {b=b-a; if(b.z()){while(num--)a.mul2();a.out();break;}}
8     }
View Code
原文地址:https://www.cnblogs.com/SXia/p/6815265.html