编程求n个数的最小公倍数

1 最大公约数、最小公倍数

  1. 最小公倍数(Least Common Multiple)
    两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数
  2. 最大公约数(Greatest Common Divisor)
    最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个
  3. 两个数的最小公倍数和最大公约数之间的关系
    设两数乘积(product)为p,最大公约数为gcd,最小公倍数为lcm。则:p = gcd * lcm
  4. 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));
1020的最大公约数:10
1020的最小公倍数: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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值