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;
}
数学证明
-
设
d = gcd(a, b),则d能整除a和b。- 因为
a = b * q + r,所以r = a - b * q。 - 由于
d能整除a和b,它必然也能整除r(因为r是a和b的线性组合)。 - 因此,
d是b和r的公约数,即d能整除gcd(b, r)。
- 因为
-
反过来,设
d' = gcd(b, r),则d'能整除b和r。- 因为
a = b * q + r,d'也能整除a(同样是线性组合)。 - 因此,
d'是a和b的公约数,即d'能整除gcd(a, b)。
- 因为
-
综上:
d能整除d'(因为d是b和r的公约数,而d'是它们的最大公约数)。d'能整除d(因为d'是a和b的公约数,而d是它们的最大公约数)。- 所以
d = d',即gcd(a, b) = gcd(b, a % b)。

浙公网安备 33010602011771号