这是我参与更文挑战的第21天,活动详情查看:更文挑战
今天我在练习FreeCodeCamp的时候,发现一道很有意思的初级算法题目,特地和大家分享一下。
题目描述
找到可以被两者以及这些参数之间范围内的所有序列号均分的所提供参数的最小公倍数。
该范围将是一个由两个数字组成的数组,不一定按数字顺序排列。
例如,如果给定 1 和 3,请找出 1 和 3 的最小公倍数,该倍数也可以被1 和 3之间的所有数字整除。 这里的答案是 6。
测试实例
解题思路
当我刚刚看到这道题目的时候,我在想求最小公倍数这还不简单?但是事情仿佛没那么容易,原因在于题目中让我们求的不是两个数字的最小公倍数,而是这个区间范围内的最小公倍数,所以看懂题目很关键。
难点:如何求两个数的最小公倍数
思路
- 首先默认两个数字中较大的那个为最小公倍数。
- 通过while循环,只要默认的最小公倍数小于等于两数的乘积便进入循环,如果这个默认的最小公倍数对左边的数趋于为零,说明这个是最小公倍数直接返回即可,反之,让这个默认的最小公倍数加上右边的值继续循环。
代码
// 获取最小公倍数的函数 function getSCM(left, right) { // 首先默认最小公倍数为right let SCM = right; while (SCM <= right * left) { if (SCM % left === 0) { return SCM } else { SCM = SCM + right; } } } 复制代码
解题代码
function smallestCommons(arr) { arr.sort((next, pre) => next - pre); // 获取最小公倍数的函数 function getSCM(left, right) { // 首先默认最小公倍数为right let SCM = right; while (SCM <= right * left) { if (SCM % left === 0) { return SCM } else { SCM = SCM + right; } } } // 生成数组 const newArr = []; for (let i = arr[0]; i <= arr[1]; i++) { newArr.push(i); } let result = arr[0] * (arr[0] + 1); // 通过循环不断更新最小公倍数 for (let i = 2; i < newArr.length; i++) { result = getSCM(newArr[i], result); } return result; } smallestCommons([1, 5]); 复制代码
本题给我们的启示
- 学会通过循环的方式来求两个数字的最小公倍数。
- 学会通过更新的方式来获取,范围内的最小公倍数。