作业比赛编号 : 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 ÷ 3 = 6,没有余数,所以 18 是 3 的倍数。
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. 1
    计算 r = m % n,得到余数。
  2. 2
    如果余数不是 0,就让 m = n、n = r。
  3. 3
    继续计算新的余数。余数变成 0 时,n 就是答案。

用辗转相除法计算 24 和 18

轮次被除数 m除数 n余数 r = m % n
第 1 轮24186
第 2 轮1860
余数变成 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 和 12424
7 和 5135
6 和 18618
记忆小口诀:公因数里找最大,公倍数里找最小;先用辗转求公因,再用公式求公倍。
今天学会了:用整除判断因数和倍数,用辗转相除法解决两个数的共同问题。

比赛尚未开始或私有,不能查看题目。




返回上一页