輾轉相除法
輾轉相除法(也稱歐幾里德演算法)是一種用於計算兩個整數的最大公約數(Greatest Common Divisor, GCD)的有效方法。其原理基於以下性質:若 ( a >=b ),則 gcd(a,b)=gcd(b,a mod b)。這意味著可以透過反覆將較大數替換為它與較小數的餘數來求得最大公約數。
原理解析:
-
基本性質:若 ( b = 0 ),則gcd(a,0)=a,即任意整數與0的最大公約數為其自身。
-
遞迴過程:對於任意兩個整數 ( a ) 和 ( b ),若 a>=b,則計算 ( a mod b ),並遞迴呼叫以 ( b ) 和 ( a mod b ) 為引數的函式,直至 ( b ) 變為0,返回此時的 ( a )。
以下是使用迭代法實現輾轉相除法的 C++ 程式碼
#include <iostream>
// 函式計算最大公約數,使用輾轉相除法
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int main() {
int a, b;
std::cout << "輸入兩個整數:";
std::cin >> a >> b;
int result = gcd(a, b);
std::cout << "它們的最大公約數是:" << result << std::endl;
return 0;
}
以下是使用遞迴實現輾轉相除法的 C++ 程式碼,並附帶一個示例:
#include <iostream>
// 遞迴函式計算最大公約數,使用輾轉相除法
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
int main() {
int a, b;
std::cout << "輸入兩個整數:";
std::cin >> a >> b;
int result = gcd(a, b);
std::cout << "它們的最大公約數是:" << result << std::endl;
return 0;
}
程式碼說明:
gcd
函式使用遞迴方式實現了輾轉相除法。- 如果
b
等於0,直接返回a
,即遞迴的終止條件。 - 否則,遞迴呼叫
gcd
函式,傳入b
和a % b
作為引數,直至b
變為0為止。 main
函式與之前的示例相同,接受使用者輸入的兩個整數,並呼叫gcd
函式計算它們的最大公約數,然後輸出結果。
示例:
假設使用者輸入的兩個整數是 48 和 18。
-
第一次呼叫
gcd(48, 18)
:- 因為
b
不為0,執行遞迴呼叫gcd(18, 48 % 18)
,即gcd(18, 12)
。
- 因為
-
第二次呼叫
gcd(18, 12)
:- 因為
b
不為0,執行遞迴呼叫gcd(12, 18 % 12)
,即gcd(12, 6)
。
- 因為
-
第三次呼叫
gcd(12, 6)
:- 因為
b
不為0,執行遞迴呼叫gcd(6, 12 % 6)
,即gcd(6, 0)
。
- 因為
-
第四次呼叫
gcd(6, 0)
:- 這時
b
等於0,返回a
,即返回6。
- 這時
因此,48 和 18 的最大公約數是6,程式碼執行結果將輸出:
輸入兩個整數:48 18
它們的最大公約數是:6
這種遞迴實現方式與迭代方式相比,在思路上更加直觀,但可能在處理極端大的數時,可能會面臨遞迴深度的限制。
遞迴程式碼的簡化
上述遞迴程式碼可以從兩行簡化為一行,程式碼如下:
int gcd(int x, int y)
{
return y ? gcd(y, x % y) : x;
}
求最小公倍數:
我們都知道:兩個整數x,y。它們的乘積 xy=最大公約數最小公倍數,那麼我們只需要求出最大公約數,就可以算出最小公倍數。
C++程式碼如下
int lcm(int x, int y)
{
return x / gcd(x, y) * y;
}