最小公倍數 LCM(a,b) = |a × b| / GCD(a,b)
最大公約數 GCD 使用歐幾里得算法(輾轉相除法)。
gb = k * l \n; // 語法錯誤:反斜桿換行導致語句不完整,且未除以 GCD
正確寫法:
gb = k * l / n; // n 為輾轉相除法得到的 GCD
#include <stdio.h>
#include <stdlib.h> // labs()
long long gcd(long long a, long long b) {
a = llabs(a); b = llabs(b);
while (b) { long long r = a % b; a = b; b = r; }
return a;
}
long long lcm(long long a, long long b) {
if (a == 0 || b == 0) return 0;
long long g = gcd(a, b);
// 先除後乘,避免溢出
return llabs(a / g * b);
}
int main() {
long long m, n;
if (scanf("%lld %lld", &m, &n) != 2) return 1;
printf("GCD = %lld\nLCM = %lld\n", gcd(m, n), lcm(m, n));
return 0;
}
long long (64位) 替代 int,擴大表示範圍;a / g * b 而非 a * b / g,極大降低溢出概率;long long lcm_array(long long *arr, int n) {
long long res = arr[0];
for (int i = 1; i < n; i++) res = lcm(res, arr[i]);
return res;
}