我试图编写一个带两个数字并返回最小公倍数的函数,该公共倍数也可被这些数字之间的所有数字整除,我只能使用1,1到1 ,12,但由于某种原因停止工作在1,13。其他设置如12,14工作,但我无法弄清楚为什么或模式是什么。
function smallestCommons(arr) {
arr.sort(function(a, b) {
return a-b;
});
var arr1 = [];
var arr2 = [];
for (var k = arr[0]; k<=arr[1]; k++) {
arr1.push(k);
}
function remainder(val1, val2) {
return val1%val2;
}
var b = arr1.reduce(function(a, b) {
return a*b;
});
var i = arr1[arr1.length-1]*arr1[arr1.length-2];
while (i<=b) {
for (var m = 0; m<arr1.length; m++) {
var a = remainder(i, arr1[m]);
arr2.push(a);
}
var answer = arr2.reduce(function(c, d) {
return c+d;
});
if (answer === 0) {
return i;
} else {
arr2 = [];
i++;
}
}
}
答案 0 :(得分:1)
我猜您可以在JavaScript中执行以下操作;它可以计算最多216个项目数组的公共LCM,例如[1,2,3,...,216]
,小于0.25毫秒。
function gcd(a,b){
var t = 0;
a < b && (t = b, b = a, a = t); // swap them if a < b
t = a%b;
return t ? gcd(b,t) : b;
}
function lcm(a,b){
return a/gcd(a,b)*b;
}
var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13],
brr = Array(216).fill().map((_,i) => i+1), // limit before Infinity
result = arr.reduce(lcm);
console.log(result);
console.time("limit");
result = brr.reduce(lcm);
console.timeEnd("limit");
console.log(result);
答案 1 :(得分:1)
一种方法是将范围内的最大数与不断增加的数相乘,然后检查是否所有其他数都可以被该数整除。如果是,则返回或继续循环。
这是我在打字稿中的解决方案...
function findLowestCommonMultipleBetween(start: number, end: number): number {
let numbers: number[] = [];
for (let i = start; i <= end; i++) {
numbers.push(i);
}
for (let i = 1; true; i++) {
let divisor = end * i;
if (numbers.every((number) => divisor % number == 0)) {
return divisor;
}
}
}
...但对于更大的范围,this 是一个更有效的答案:)
答案 2 :(得分:0)
这是真的! [1,13]的结果是360360.在此之后我们有[1,14]。
14 = 2 * 7我们现在360360可分为2和7,所以答案又是360360。
[1,15]:15 = 3 * 5,结果相同。
[1,16]:结果是720720。
[1,17]:结果是:12252240
[1,18]:18 = 2 * 9,结果为12252240,与17
相同[1,19]:对于我的电脑来说,这个过程非常繁重,无法做到这一点。但是在强大的机器中,它会起作用。我承诺。但是你的代码性能不佳。
答案 3 :(得分:0)
据我所知,你的算法正在给你一个正确答案。
我远非专业程序员,所以任何想要的人都可以选择改进我的代码或风格:)
如果您希望能够自己检查答案,可以查看这个小提琴: https://jsfiddle.net/cowCrazy/Ld8khrx7/
function multiplyDict(arr) {
arr.sort(function (a, b) {
return a - b;
});
if (arr[0] === 1) {
arr[0] = 2;
}
var currentArr = [];
for (var i = arr[0]; i <= arr[1]; i++) {
currentArr.push(i);
}
var primeDivs = allPrimes(arr[1]);
var divsDict = {};
for (var j = currentArr[0]; j <= currentArr[currentArr.length -1]; j++){
divsDict[j] = [];
if (primeDivs.indexOf(j) > -1) {
divsDict[j].push(j);
} else {
var x = j;
for (var n = 2; n <= Math.floor(j / 2); n++) {
if (x % n === 0) {
divsDict[j].push(n);
x = x / n;
n--;
continue;
}
}
}
}
return divsDict;
}
function allPrimes(num) {
var primeArr = [];
var smallestDiv = 2;
loopi:
for (var i = 2; i <= num; i++) {
loopj:
for (var j = smallestDiv; j <= largestDiv(i); j++) {
if (i % j === 0) {
continue loopi;
}
}
primeArr.push(i);
}
return primeArr;
}
function largestDiv (a) {
return Math.floor(Math.sqrt(a));
}
multiplyDict([1,13]);
它给出了所请求数组的字典和每个元素的除数。 从那里你可以自己去检查你的算法是否做得对,或者你可以在这里检查: https://jsfiddle.net/cowCrazy/kr04mas7/
我希望它有所帮助
答案 4 :(得分:0)
以N个数字查找LCM。 它与ES6兼容,并考虑到在需要查找大量数字的情况下无法控制边界。
var a = [10, 40, 50, 7];
console.log(GetMinMultiple(a));
function GetMinMultiple(data) {
var maxOf = data.reduce((max, p) => p > max ? p : max, 0);
var incremental = maxOf;
var found = false;
do {
for (var j = 0; j < data.length; j++) {
if (maxOf % data[j] !== 0) {
maxOf += incremental;
break;
}
else {
if (j === data.length - 1) {
found = true;
break;
}
}
}
} while (!found);
return maxOf;
}
答案 5 :(得分:0)
这是我在Typescript中的解决方案
function greatestCommonDivider(x: number, y: number): number {
if (y === 0) {
return x;
}
return greatestCommonDivider(y, x % y);
}
function singleLowestCommonMultiply(x: number, y: number): number {
return (x * y) / greatestCommonDivider(x, y);
}
function lowestCommonMultiply(...numbers: number[]): number {
/**
* For each number, get it's lowest common multiply with next number.
*
* Then using new number, compute new lowest common multiply
*/
return numbers.reduce((a, b) => {
return singleLowestCommonMultiply(a, b);
});
}
lowestCommonMultiply(2, 3); // Outputs 6
lowestCommonMultiply(2, 3, 5); // Outputs 30
游乐场-click here