作业比赛编号 : 3072 - 【CSPtch-Jing】循环4 | 最大公约数与最小公倍数
公约数与公倍数
从“能不能整除”出发,认识最大公因数和最小公倍数。一、先认识因数和倍数
如果 a 除以 b 没有余数,也就是 a % b == 0,那么 b 是 a 的因数,同时 a 是 b 的倍数。
因数,也叫约数
因为 18 ÷ 3 = 6,没有余数,所以 3 是 18 的因数。
18 的因数有:1、2、3、6、9、18。
18 的因数有:1、2、3、6、9、18。
倍数
因为 18 ÷ 3 = 6,没有余数,所以 18 是 3 的倍数。
3 的倍数有:3、6、9、12、15、18……
3 的倍数有:3、6、9、12、15、18……
二、最大公因数
两个数共同拥有的因数叫作公因数。公因数中最大的一个,就是最大公因数,也叫最大公约数。例子:18 和 24
18 和 24 的公因数有:
1236
其中最大的数是 6,所以 18 和 24 的最大公因数是 6。
特点 1
最大公因数一定能同时整除这两个数。
特点 2
如果 a < b,最大公因数一定小于或等于 a。
三、辗转相除法
数字较大时,一个个列出因数会比较慢。可以使用辗转相除法,它也叫欧几里得算法。重要规律:两个数 m 和 n 的最大公因数,等于 n 和余数 r 的最大公因数。
- 1
计算 r = m % n,得到余数。 - 2
如果余数不是 0,就让 m = n、n = r。 - 3
继续计算新的余数。余数变成 0 时,n 就是答案。
用辗转相除法计算 24 和 18
| 轮次 | 被除数 m | 除数 n | 余数 r = m % n |
|---|---|---|---|
| 第 1 轮 | 24 | 18 | 6 |
| 第 2 轮 | 18 | 6 | 0 |
余数变成 0,此时除数是 6,所以最大公因数是 6。
C++ 模板
int m, n;
cin >> m >> n;
int r = m % n;
while (r != 0) {
m = n;
n = r;
r = m % n;
}
cout << n;
四、最小公倍数
两个数共同拥有的倍数叫作公倍数。公倍数中最小的一个,就是最小公倍数。例子:18 和 24
18 的倍数:18、36、54、72、90、108、126、144……24 的倍数:24、48、72、96、120、144……
它们最小的共同倍数是 72,所以 18 和 24 的最小公倍数是 72。
特点 1
最小公倍数一定能被这两个数分别整除。
特点 2
如果 a < b,最小公倍数一定大于或等于 b。
五、用公式求最小公倍数
两个正整数的乘积,等于它们的最大公因数与最小公倍数的乘积。最小公倍数 = 两个数的乘积 ÷ 最大公因数
18 和 24 的最大公因数是 6,所以:18 × 24 ÷ 6 = 72
同时求最大公因数和最小公倍数
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int m = a;
int n = b;
int r = m % n;
while (r != 0) {
m = n;
n = r;
r = m % n;
}
int gcd = n; // 最大公因数
int lcm = a / gcd * b; // 最小公倍数
cout << "最大公因数:" << gcd << endl;
cout << "最小公倍数:" << lcm << endl;
return 0;
}
为什么写成 a / gcd * b?先除后乘,可以让中间计算得到的数字小一些。
六、容易混淆的地方
- 因数通常比较小:它可以整除原来的数。
- 倍数通常不断变大:一个正整数的倍数有无数个。
- 最大公因数找“最大的共同因数”:答案不会大于两个数中较小的数。
- 最小公倍数找“最小的共同倍数”:答案不会小于两个数中较大的数。
- 公式法要先正确求出最大公因数,并保存原来的两个数。
- 本页程序讨论的是两个正整数,输入的两个数都应大于 0。
检查方法:求出答案后,可以用取余验证。最大公因数应能整除两个原数;最小公倍数应能被两个原数整除。
七、动手练习
先在纸上算一算,再用程序验证:| 两个数 | 最大公因数 | 最小公倍数 |
|---|---|---|
| 8 和 12 | 4 | 24 |
| 7 和 5 | 1 | 35 |
| 6 和 18 | 6 | 18 |
记忆小口诀:公因数里找最大,公倍数里找最小;先用辗转求公因,再用公式求公倍。
