一行代碼求最大公約數(歐幾里得算法)

本文要介紹的不是普通的歐幾里德算法(輾轉相除法),而是利用位操作實現的歐幾里得算法。
利用位操作實現歐幾里得算法主要有以下兩個優點:1.代碼量少  2.效率高。

首先,歐幾里德算法求最大公約數的做法是:
⒈ 令r爲a/b所得餘數(0 <= r < b) 若 r= 0,算法結束;b 即爲答案。
⒉ 互換:置 a←b,b←r,並返回第一步。


int gcd(int a, int b){
    while(b^=a^=b^=a%=b);
    return a;
}

b^=a^=b^=a%=b
可以分解成以下四句
a=a%b;
b=b^a;
a=a^b;
b=b^a;

第一句用a存餘數,剩下三句交換a,b,再配合while判斷此時b是否爲0,不爲0則繼續循環。
另外,不用擔心a,b誰大誰小的問題,如果a < b,那麼,在第一輪循環中便可將兩者換回來

發佈了30 篇原創文章 · 獲贊 21 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章