最大公約數(GCD)與最小公倍數(LCM)是數論基礎問題,C 語言通過函數封裝可實現清晰、可復用的解決方案。本文採用歐幾里得算法(輾轉相除法)實現 GY() 與 GB() 兩函數協作。
gcd(a,b) = gcd(b, a%b),直到餘數為 0,當前除數即為最大公約數。lcm(a,b) = a*b / gcd(a,b),注意防止溢出可先除後乘。#include// 最大公約數 int GY(int m, int n) { int t, r; if (n > m) { t = m; m = n; n = t; } // 確保 m >= n while ((r = m % n) != 0) { m = n; n = r; } return n; } // 最小公倍數 int GB(int m, int n) { // 先除後乘防溢出:m / GY(m,n) * n return m / GY(m, n) * n; } int main() { int x, y, gys, gbs; printf("輸入兩個正整數: "); scanf("%d%d", &x, &y); gys = GY(x, y); gbs = GB(x, y); printf("%d 和 %d 的最大公約數是:%d\n", x, y, gys); printf("%d 和 %d 的最小公倍數是:%d\n", x, y, gbs); return 0; }
m >= n,調用者無需關心大小順序。GB 中採用 m / GY * n 而非 m * n / GY,顯著降低中間結果溢出風險。GB 直接調用 GY,邏輯解耦,維護性強。GY 返回非零數,GB 返回 0(符合數學定義)。int GY_recursive(int a, int b) {
return b == 0 ? a : GY_recursive(b, a % b);
}