如何在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