1 最大公约数、最小公倍数
- 最小公倍数(Least Common Multiple)
两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数 - 最大公约数(Greatest Common Divisor)
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个 - 两个数的最小公倍数和最大公约数之间的关系
设两数乘积(product)为p
,最大公约数为gcd
,最小公倍数为lcm
。则:p = gcd * lcm
- 0 和一个数的最大公约数和最小公倍数
0除以任何一个数都得0,可以整除,所以0与一个数的最大公约数是这个数本身。一般不考虑 0 和一个数的最小公倍数,如果非要考虑,最小公倍数=0
2 编程求两数的最大公约数、最小公倍数
2.1 欧几里德算法(辗转相除法)
欧几里德算法求两数的最大公约数:gcd(a,b) = gcd(b,a mod b)
,其中a
为较大的数。
示例:用欧几里德算法求 1997 和 615 的最大公约数:
1997 / 615 = 3 (余 152)
615 / 152 = 4(余7)
152 / 7 = 21(余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 / 1 = 2 (余0)
至此,最大公约数为1。以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。
2.2 代码实现
// 非递归求最大公约数。其中 x 为较大的数
function fun_gcd1(x, y) {
let t = 0;
while (y > 0) {
t = x;
x = y;
y = t % y;
}
return x;
}
// 递归求最大公约数
function fun_gcd(x, y) {
return y == 0 ? x : fun_gcd(y, x % y);
}
// 求两数的最小公倍数。其中 x 为较大的数
function fun_lcm(x, y) {
return x * y / fun_gcd1(x, y);
}
console.log("10和20的最大公约数:" + fun_gcd(20, 10));
console.log("10和20的最小公倍数:" + fun_lcm(20, 10));
10和20的最大公约数:10
10和20的最小公倍数:20
[Finished in 0.1s]
3 编程求n个连续数字的最小公倍数
写一个函数,它接收一个包含两个数字的数组参数arr
,它的返回值为这两个数字范围内所有数字(包含这两个数字)的最小公倍数。
注意,较小数不一定总是出现在数组的第一个元素。
比如,传入[1, 3],那么函数的返回结果应为 1、2、3 的最小公倍数,即为 6。
smallestCommons([1, 5])
应该返回 60。
smallestCommons([5, 1])
应该返回 60。
smallestCommons([2, 10])
应该返回 2520。.
smallestCommons([1, 13])
应该返回 360360。
smallestCommons([23, 18])
应该返回 6056820。
function fun_gcd(x, y) {
return y == 0 ? x : fun_gcd(y, x % y);
}
function smallestCommons(arr) {
let min, max;
let lcm;
if (arr[0] > arr[1]) {
max = arr[0];
min = arr[1];
} else {
max = arr[1];
min = arr[0];
}
lcm = min * (min + 1) / fun_gcd(min + 1, min);
while (min++ < max)
lcm = min * lcm / fun_gcd(min, lcm);
return lcm;
}
console.log(smallestCommons([23, 18]));
6056820
[Finished in 0.1s]