最大公约数和最小公倍数

最大公约数和最小公倍数

最大公约数

两个数 a 和 b 的最大公约数是指它们所有公约数中最大的那个,通常记作 gcd(a, b)

定义

  • 公约数:能同时整除 a 和 b 的正整数。
  • 最大公约数:所有公约数集合中的最大值。
  • 例如:gcd(12, 18) = 6,因为 6 是 12 和 18 的最大公约数。

求解方法

1. 欧几里得算法(辗转相除法)

原理:对于正整数 a 和 b,有 gcd(a, b) = gcd(b, a % b),其中 % 表示取模运算(求余数)。
该方法通过不断缩小问题规模,最终找到最大公约数。
详细介绍查看:欧几里得算法-CSDN博客

关键点:

  1. 递归公式gcd(a, b) = gcd(b, a % b)
  2. 终止条件:当 b = 0 时,gcd(a, 0) = a
  3. 适用范围:a 和 b 应为非负整数,且至少一个不为 0。

步骤:

  • 用 a 除以 b,得余数 a % b。
  • 将 b 作为新的 a,a % b 作为新的 b,继续计算。
  • 重复上述过程,直到余数为 0,此时被除数即为最大公约数。

示例:
gcd(48, 18)

  1. 48 ÷ 18 = 2 余 12,gcd(48, 18) = gcd(18, 12)
  2. 18 ÷ 12 = 1 余 6,gcd(18, 12) = gcd(12, 6)
  3. 12 ÷ 6 = 2 余 0,gcd(12, 6) = gcd(6, 0)
  4. 当 b = 0 时,结果为 6。
    因此,gcd(48, 18) = 6

代码实现:

// 递归版本
int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

// 三元运算符简化版
int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}
2. 更相减损法(补充)

原理:基于 gcd(a, b) = gcd(a - b, b)(当 a > b 时),通过不断相减缩小问题规模。
缺点:效率低于辗转相除法,尤其当两数差距较大时。

示例:
gcd(18, 12)

  1. 18 - 12 = 6,gcd(18, 12) = gcd(12, 6)
  2. 12 - 6 = 6,gcd(12, 6) = gcd(6, 6)
  3. 6 - 6 = 0,gcd(6, 6) = gcd(6, 0)
  4. 结果为 6。
注意事项
  • 输入需为整数,若为负数,可取绝对值处理(如 gcd(a, b) = gcd(|a|, |b|))。
  • 若 a = 0 且 b = 0,gcd(0, 0) 通常无定义,但在某些场景下约定为 0。

最小公倍数

两个数 a 和 b 的最小公倍数是指它们所有公倍数中最小的一个,通常记作 lcm(a, b)

定义

  • 公倍数:同时是 a 和 b 的倍数的正整数。
  • 最小公倍数:所有公倍数集合中的最小值。
  • 例如:lcm(12, 18) = 36,因为 36 是 12 和 18 的最小公倍数。

求解方法

基于最大公约数

公式:对于正整数 a 和 b,lcm(a, b) = (a * b) / gcd(a, b)
原理:两个数的乘积等于它们的最大公约数与最小公倍数的乘积。

步骤:

  1. 先用欧几里得算法求出 gcd(a, b)
  2. 用公式 lcm(a, b) = (a * b) / gcd(a, b) 计算最小公倍数。

示例:
lcm(12, 18)

  1. 已知 gcd(12, 18) = 6
  2. lcm(12, 18) = (12 * 18) / 6 = 216 / 6 = 36
    因此,lcm(12, 18) = 36

代码实现:

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

int lcm(int a, int b) {
    return (a * b) / gcd(a, b);
}
注意事项
  • 为避免整数溢出,建议先计算 a / gcd(a, b),再乘以 b。
  • 输入为 0 时,lcm(0, b) 无意义,通常不定义。

优化代码(避免溢出):

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

int lcm(int a, int b) {
    return a / gcd(a, b) * b; // 先除后乘
}

性质

  1. gcd(a, a) = alcm(a, a) = a
  2. gcd(a, 1) = 1lcm(a, 1) = a
  3. gcd(a, b) = 1,则 a 和 b 互质,lcm(a, b) = a * b

应用

  • 最大公约数:分数约分、整数分解。
  • 最小公倍数:计算周期性事件的共同起点(如两列火车发车时间的最早重合)。

你可能感兴趣的:(算法,算法,c++,C++)