最大公约数
最大公约数与最小公倍数
最大公约数:若干数的最大的共同约数,记作
最小公倍数:若干数的最小的共同倍数,记作
设
因为
所以
所以 $ a*b = gcd(a,b)lcm(ab)$。
多个数的最大公约数:
多个数的最小公倍数:
更相减损术
若要求两个数字
假设
所以两个互相加减并不会影响他们是
自然想到:每次用
cpp
int gcd(int a,int b)
{
if(a==0||b==0) return a+b;
if(a<b) swap(a,b);
return gcd(a-b,b);
}
1
2
3
4
5
6
2
3
4
5
6
时间复杂度
辗转相除法
又称欧几里得算法
一直用大的数减去小的数,其实可以用取模一步到位。
cpp
int gcd(int a,int b)
{
if(b==0) return a;
return gcd(b,a%b);
}
1
2
3
4
5
2
3
4
5
因为每次取模至少会让数字变为原来的一半,所以时间复杂度是
当我们求
表面上是
实际上,最大公约数只会单方向变小,所以是
二进制数最大公约数
求两个二进制大整数
分类讨论:
除以二可以用删除最后一位代替。
当
用这种方法避免了转换成十进制以及写高精度取模等复杂度操作。