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)
。