更相减损术
据说是数学必修三的内容,(雾)。
部分摘自百度百科:
更相减损术是出自《九章算术》的一种求最大公约数的算法。
原文:可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。
操作:
- 任意给定两个正整数;判断它们是否都是偶数。若是,则用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 }