首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言求最小公倍數:輾轉相除法與溢出防範實戰

     編輯:C 語言問答

數學公式

最小公倍數 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;
}

關鍵點解析

  1. 類型升級:用 long long (64位) 替代 int,擴大表示範圍;
  2. 先除後乘:a / g * b 而非 a * b / g,極大降低溢出概率;
  3. 絕對值處理:負數輸入取絕對值,符合數學定義;
  4. 零值保護:任一為 0 時 LCM 定義為 0,避免除零錯誤。

擴展:多數 LCM

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;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved