最大公约数和最小公倍数详解
一、最大公约数(GCD)
1. 什么是最大公约数?
最大公约数(Greatest Common Divisor),简称GCD,是指两个或多个整数共有约数中最大的一个。
例子:求15和12的最大公约数
- 15的约数:1, 3, 5, 15
- 12的约数:1, 2, 3, 4, 6, 12
- 公共约数:1, 3
- 最大公约数:3
2. 计算方法
方法一:枚举法
从较小的数开始向下枚举,找到的第一个公约数就是最大公约数。
#include<iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
for(int i = min(a,b); i >= 1; i--) {
if(a % i == 0 && b % i == 0) {
cout << i;
break;
}
}
return 0;
}
方法二:辗转相除法(欧几里得算法)
更高效的算法,基于以下原理:
- 用较大数除以较小数,得到余数
- 用较小数除以余数,重复这个过程
- 直到余数为0,最后的除数就是GCD
#include<iostream>
using namespace std;
int main() {
int a, b, r;
cin >> a >> b;
while(a % b != 0) {
r = a % b;
a = b;
b = r;
}
cout << b;
return 0;
}
二、最小公倍数(LCM)
1. 什么是最小公倍数?
最小公倍数(Least Common Multiple),简称LCM,是指两个或多个整数公有的倍数中最小的一个。
2. 计算方法
方法一:枚举法
从较大的数开始向上枚举,找到的第一个公倍数就是LCM。
#include<iostream>
#include<cmath>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
for(int i = max(a,b); i <= a*b; i++) {
if(i % a == 0 && i % b == 0) {
cout << i;
break;
}
}
return 0;
}
方法二:公式法
利用GCD和LCM的关系:LCM(a,b) = (a × b) / GCD(a,b)
#include<iostream>
using namespace std;
int gcd(int a, int b) {
while(a % b != 0) {
int r = a % b;
a = b;
b = r;
}
return b;
}
int main() {
int a, b;
cin >> a >> b;
cout << a * b / gcd(a, b);
return 0;
}
三、知识脉络图
四、典型题目解析
题目1:求自然数的因数
#include <iostream>
using namespace std;
int main() {
int n, cnt = 0;
cin >> n;
for(int i = 1; i < n; i++) {
if(n % i == 0) {
cout << i << ",";
cnt++;
}
}
cout << n << endl << "total=" << cnt + 1;
return 0;
}
题目2:最大公约数
#include<iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
for(int i = min(a,b); i >= 1; i--) {
if(a % i == 0 && b % i == 0) {
cout << i;
break;
}
}
return 0;
}
题目3:辗转相除法过程演示
#include<iostream>
using namespace std;
int n, m;
int main() {
cin >> n >> m;
cout << n << ' ' << m << endl;
while(n % m) {
int t = n % m;
n = m;
m = t;
cout << n << ' ' << m << endl;
}
cout << m << ' ' << 0 << endl;
return 0;
}
题目4:求最小公倍数
#include<iostream>
using namespace std;
int main() {
long long a, b, m, n, r;
cin >> a >> b;
m = a;
n = b;
while(m % n != 0) {
r = m % n;
m = n;
n = r;
}
cout << a * b / n;
return 0;
}
五、总结
- 最大公约数:两个数共有的最大约数
- 计算方法:枚举法、辗转相除法
- 最小公倍数:两个数共有的最小倍数
- 计算方法:枚举法、公式法(利用GCD)
- 关系:LCM(a,b) × GCD(a,b) = a × b