Skip to content

如何在JavaScript中计算最大公约数和最小公倍数?

最大公约数

最大公约数GCD)是指两个或多个整数中能够整除每个整数的最大正整数。

欧几里得算法

欧几里得算法是一种计算两个数的最大公约数的高效方法。实际上,这意味着递归地应用观察到的规律 gcd(a, b) = gcd(b, a % b),直到 b 变为为止。当 b 为零时,我们有 gcd(a, 0) = a

const gcd = (a, b) => (!b ? a : gcd(b, a % b));

gcd(8, 36); // 4

多个数字的最大公约数

可以通过计算每对数字的最大公约数来计算多个数字的最大公约数。在递归函数的基础上,我们可以使用 Array.prototype.reduce() 将操作应用于多个数字。每对数字的结果值然后作为下一步的第一个参数使用。

const gcd = (a, b) => (!b ? a : gcd(b, a % b));
const gcdMultiple = (...arr) => [...arr].reduce((a, b) => gcd(a, b));

## 最大公约数和最小公倍数

最大公约数(GCD)是指两个或多个整数共有约数中最大的一个数。最小公倍数(LCM)是指两个或多个整数公有的倍数中最小的一个数。

### 两个数的最大公约数

两个数的最大公约数可以通过使用**辗转相除法**来计算。辗转相除法是指用较大的数除以较小的数,然后用余数再去除较小的数,直到余数为0为止。最后的除数就是最大公约数。

```js
const gcd = (a, b) => (!b ? a : gcd(b, a % b));

gcd(12, 8); // 4

多个数的最大公约数

类似于两个数的最大公约数,多个数的最大公约数也可以使用Array.prototype.reduce()来计算。首先计算前两个数的最大公约数,然后将结果和下一个数继续进行计算,直到所有的数都被迭代完。

const gcd = (a, b) => (!b ? a : gcd(b, a % b));

const gcdMultiple = (...numbers) => {
  return numbers.reduce((a, b) => gcd(a, b));
};

gcdMultiple(12, 8, 32); // 4

两个数的最小公倍数

两个数的最小公倍数可以通过使用最大公约数公式和lcm(x, y) = x * y / gcd(x, y)的事实来计算。

const gcd = (a, b) => (!b ? a : gcd(b, a % b));
const lcm = (x, y) => (x * y) / gcd(x, y);

lcm(12, 7); // 84

多个数的最小公倍数

类似于最大公约数,多个数的最小公倍数也可以使用Array.prototype.reduce()来计算。首先计算前两个数的最小公倍数,然后将结果和下一个数继续进行计算,直到所有的数都被迭代完。

const gcd = (a, b) => (!b ? a : gcd(b, a % b));
const lcm = (x, y) => (x * y) / gcd(x, y);

const lcmMultiple = (...numbers) => {
  return numbers.reduce((a, b) => lcm(a, b));
};

lcmMultiple(12, 8, 32); // 96
const lcmMultiple = (...arr) => [...arr].reduce((a, b) => lcm(a, b));

lcmMultiple(12, 7); // 84
lcmMultiple(...[1, 3, 4, 5]); // 60
const lcmMultiple = (...arr) => [...arr].reduce((a, b) => lcm(a, b));

lcmMultiple(12, 7); // 84
lcmMultiple(...[1, 3, 4, 5]); // 60