求最大公因數
求兩數的最大公因數通常的做法是對兩個數因式分解,找出共同的素數,然後求出最大公因數(GCD)。但是當數字越大時,因式分解就越困難,此時,使用歐幾里得演算法就能高效求出其最大公因數。
歐幾里得演算法
歐幾里得演算法(又稱輾轉相除法)用於計算兩個數的最大公因數,被稱為是世界上最古老的演算法。
基本思想
兩個正整數
a
和b
,它們的最大公約數(gcd(a,b))
與b
和a
除以b
得到的餘數的最大公約數(gcd(b,a%b))
相同。
透過不斷用較小的數替換較大的數,並取餘數,最終在餘數為0時找到最大公約數。
舉例說明
以求1112
與695
這兩個數的最大公約數為例:
-
首先用較大的數字除以較小的數字,求出餘數,也就是堆兩個數字進行模運算。得到餘數
417
-
接下來再用除數
695
和餘數417
進行模運算,結果為278
。
-
繼續進行同樣的操作,對
417
和278
作模運算,結果為139。
-
對
278
和139
作模運算,結果為0,也就是說278可以被139整除。
-
餘數為0時,最後一次運算中的除數
139
就是1112
和695
的最大公約數。
演算法實現
#include "iostream"
using namespace std;
/*歐幾里得演算法—求最大公約數—迭代實現*/
int gcd(int a, int b){
while (b != 0){
int tmp = a;
a = b;
b = tmp % b;
}
return a;
}
/*歐幾里得演算法—求最大公約數—遞迴實現*/
int gcd_dg(int a, int b){
return b == 0 ? a : gcd_dg(b, a % b);
}
int main(){
cout << gcd(1112, 695) << endl;
cout << gcd_dg(1112, 695) << endl;
system("pause");
return 0;
}