一、背景介紹
在數學中,最大公約數(Greatest Common Divisor, 簡稱GCD)和最小公倍數(Least Common Multiple, 簡稱LCM)是兩個非常重要的概念。
最大公約數是指兩個或多個整數共有約數中最大的一個,例如 8 和 12 的最大公約數是 4。
最小公倍數是指兩個或多個整數公有的倍數中最小的一個,例如 4 和 6 的最小公倍數是 12。
獲得最大公約數和最小公倍數有很多方法,本文將介紹用C++實現的方法。
二、輾轉相除法
輾轉相除法,又稱歐幾里得演算法,是求最大公約數的經典方法。該演算法基於如下性質:兩個正整數a和b(a>b)的最大公約數等於a除以b的餘數c和b之間的最大公約數。
代碼實現如下:
int gcd(int a, int b)
{
if (a < b) //保證a大於b
swap(a, b);
if (b == 0)
return a;
return gcd(b, a % b);
}對於求最小公倍數,可以先使用輾轉相除法求出最大公約數,然後套用以下公式:
最小公倍數 = a×b / 最大公約數
代碼實現如下:
int lcm(int a, int b)
{
return a * b / gcd(a, b);
}三、更相減損術
更相減損術是另一種求最大公約數的方法。該演算法基於如下性質:兩個正整數a和b(a>b)的最大公約數等於a-b的差值c和較小數b之間的最大公約數。
代碼實現如下:
int gcd(int a, int b)
{
if (a < b)
swap(a, b);
while (a - b != b) //循環終止條件為 a-b=b
{
int temp = a - b;
a = max(b, temp);
b = min(b, temp);
}
return b;
}但是,這種演算法的效率遠低於輾轉相除法,因此不常用。
四、更優秀的實現
雖然輾轉相除法已經很優秀了,但是還是可以進一步優化。
一種優化的方法是 Stein演算法,結合了更相減損術和位移運算的思想。該演算法在計算機上運行的效率比輾轉相除法要高,因為位移運算比除法運算要快。
代碼實現如下:
int gcd(int a, int b)
{
if (a == 0) return b;
if (b == 0) return a;
int shift;
for (shift = 0; ((a | b) & 1) == 0; ++shift)
{
a >>= 1;
b >>= 1;
}
while ((a & 1) == 0) a >>= 1;
do {
while ((b & 1) == 0) b >>= 1;
if (a > b) swap(a, b);
b -= a;
} while (b != 0);
return a << shift;
}對於求最小公倍數,也可以使用 Stein演算法。代碼實現如下:
int lcm(int a, int b)
{
return a / gcd(a, b) * b;
}五、總結
求最大公約數和最小公倍數是我們在編程中經常會碰到的問題,本文主要介紹了輾轉相除法、更相減損術和 Stein演算法三種方法,其中輾轉相除法是應用最廣泛的。
需要注意的是,在使用求最小公倍數公式時,由於乘法運算的結果可能超出 int 類型的範圍,因此需要使用更高精度的數據類型,如 long long。
希望本文能夠對讀者有所幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/297873.html
微信掃一掃
支付寶掃一掃