1.GCD --最大公约数
- GCD是表示整数 a 和 b 的最大公因数 是指 能同时整除a和b的最大整数,记为gcd(a, b)。 例如:gcd(4, 8) = 4。
具体的实现有:
1. 直接使用c++头文件algorithm中的__gcd(a,b)
,如果参加比赛(acm,蓝桥杯)较为方便#include<iostream> #include<algorithm> using namespace std; int main() { int a, b; cin >> a >> b; # a=8,b=12 时 cout << __gcd(a, b) ; //结果:4 return 0; }
- 欧几里得算法(辗转相除法-中国的说法)
int gcd(int a, int b){ // 一般要求a>=0, b>0。 //若a=b=0,代码也正确,返回0 cout << a << ", " <<b << endl; return b? gcd(b, a%b) : a; }
2.LCM -最小公倍数
- lcm(a,b)表示a和b的最小公倍数,可以从算术基本定理推理得到。
算术基本定理(唯一分解定理):任何大于1的正整数n都可以唯一分解为有限个素数的乘积
可以由算法基本定理推出:
lcm(a,b) = a∗b/gcd(a,b) = a/gcd(a,b)∗b
注:我们使用先做除法再做乘法,如果先做乘法可能会溢出
所以我们求lcm(a,b)的时候,直接使用gcd就可以算出
实现:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a, b;
cin >> a >> b; // 测试: a=8, b= 12
cout << a / __gcd(a, b) * b; //结果: 24
return 0;
}
或者使用:
int lcm(int a, int b){
return a / gcd(a, b) * b;
}
如果觉得对你有帮助,就点个赞支持一下吧,共同进步。