gcd(最大公约数)与lcm(最小公倍数)模板

#include<bits/stdc++.h> 

using namespace std;
int n;
int gcd(int a, int b) 
{
    return b == 0 ? a : gcd(b, a % b);
}
int lcm(int a, int b) 
{
    return (a / gcd(a, b)) * b; // 先除后乘避免溢出
}
int main( )
{
    cout<<gcd(18,12)<<endl;
    return 0;
}

数学证明

  1. d = gcd(a, b),则 d 能整除 ab

    • 因为 a = b * q + r,所以 r = a - b * q
    • 由于 d 能整除 ab,它必然也能整除 r(因为 rab 的线性组合)。
    • 因此,dbr 的公约数,即 d 能整除 gcd(b, r)
  2. 反过来,设 d' = gcd(b, r),则 d' 能整除 br

    • 因为 a = b * q + rd' 也能整除 a(同样是线性组合)。
    • 因此,d'ab 的公约数,即 d' 能整除 gcd(a, b)
  3. 综上

    • d 能整除 d'(因为 dbr 的公约数,而 d' 是它们的最大公约数)。
    • d' 能整除 d(因为 d'ab 的公约数,而 d 是它们的最大公约数)。
    • 所以 d = d',即 gcd(a, b) = gcd(b, a % b)

另有:ab=gcd(a,b)lcm(a,b),据此可求lcm

posted @ 2025-06-18 20:27  邓佑孤  阅读(36)  评论(0)    收藏  举报