求最大公约数(最大公因子 GCD)
质因数分解法
例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,(24,60)=12。
辗转相除法
gcd(a,b) = gcd(b,a mod b)
1 | int gcd(int a,int b) |
- 迭代形式
1 |
|
C++内置函数法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using namespace std;
int gcd(int a,int b)
{
return std::__gcd(a,b);
}
int main(){
int a=24,b=60;
int ans = gcd(a,b);
cout << ans <<endl;
return 0;
}
最小公倍数(LCM)
把几个数先分别分解质因数,再把各数中的全部公有的质因数和独有的质因数提取出来连乘,所得的积就是这几个数的最小公倍数
求6和15的LCM。先分解质因数,得6=2×3,15=3×5,2×3×5=30,30是6和15的公倍数中最小的一个,所以[6,15]=30。
1 | int lcm(int a,int b) |
扩展欧几里得算法
方程符合ax + by = n,则gcd(a,b)能整除n,可用扩展欧几里得算法求(x0,y0)
1 | void exgcd(int a,int b,int &x,int &y) |