更相減損術


據說是數學必修三的內容,(霧)。

部分摘自百度百科:

更相減損術是出自《九章算術》的一種求最大公約數的算法。

原文:可半者半之,不可半者,副置分母、子之數,以少減多,更相減損,求其等也。以等數約之

操作:

  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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM