Bootstrap

C语言实例_14之求俩数的最大公约数和最小公倍数

1.最大公约数和最小公倍数概述

最大公约数(Greatest Common Divisor,简称GCD)

也称为最大公因数,是指两个或多个整数共有约数中最大的一个。例如,对于整数12和18,它们的约数分别为:

  • 12的约数有1、2、3、4、6、12。
  • 18的约数有1、2、3、6、9、18。

可以看出它们共有的约数有1、2、3、6,其中最大的就是6,所以12和18的最大公约数是6。

最小公倍数(Least Common Multiple,简称LCM)

是指两个或多个整数公有的倍数中最小的一个。继续以12和18为例,它们的倍数分别为:

  • 12的倍数有12、24、36、48、60、72……
  • 18的倍数有18、36、54、72、90……

可以发现它们公有的倍数有36、72……其中最小的是36,所以12和18的最小公倍数是36。

2. 求解最大公约数和最小公倍数的方法

1. 辗转相除法(欧几里得算法)求最大公约数

用较大数除以较小数得到商和余数,再用除数和余数反复做除法运算,当余数为0时,取当前算式除数为最大公约数。

例如求252和105的最大公约数:

  • 252 ÷ 105 = 2……42
  • 105 ÷ 42 = 2……21
  • 42 ÷ 21 = 2……0

此时余数为0,除数21就是252和105的最大公约数。

2. 通过最大公约数求最小公倍数

两个数的最小公倍数等于这两个数的乘积除以它们的最大公约数。

例如已知12和18的最大公约数是6,那么它们的最小公倍数 = 12 × 18 ÷ 6 = 36 。

3. 辗转相除法

image.png

4. C++ 代码实现及分析

#include <iostream>
using namespace std;

// 求最大公约数的函数,使用辗转相除法
int gcd(int a, int b) {
    while (b!= 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

// 求最小公倍数的函数
int lcm(int a, int b) {
    return a * b / gcd(a, b);
}

int main() {
    int num1, num2;
    cout << "请输入两个整数:";
    cin >> num1 >> num2;

    int greatestCommonDivisor = gcd(num1, num2);
    int leastCommonMultiple = lcm(num1, num2);

    cout << num1 << " 和 " << num1 << " 的最大公约数是:" << greatestCommonDivisor << endl;
    cout << num1 << " 和 " << num1 << " 的最小公倍数是:" << leastCommonMultiple << endl;

    return 0;
}

代码分析

  • 在代码中,定义了两个函数 gcdlcm
    • gcd 函数用于求两个数的最大公约数,它通过不断地进行辗转相除操作,直到余数为0,此时返回的 a 就是最大公约数。例如,传入 a = 252b = 105,在函数内部的循环过程中,会不断更新 ab 的值,直到 b 变为0,最终得到最大公约数。
    • lcm 函数用于求最小公倍数,它直接调用 gcd 函数先求出最大公约数,然后按照两个数的乘积除以最大公约数的公式来计算最小公倍数。
;