據說是數學必修三的內容,(霧)。
部分摘自百度百科:
更相減損術是出自《九章算術》的一種求最大公約數的算法。
原文:可半者半之,不可半者,副置分母、子之數,以少減多,更相減損,求其等也。以等數約之。
操作:
- 任意給定兩個正整數;判斷它們是否都是偶數。若是,則用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 }