Tell us what’s happening:
Your code so far
function smallestCommons(arr) {
arr.sort(function(a, b) {
return b - a;
});
var newArr=[];
for(var i=arr[0];i>=arr[1];i--) {
newArr.push(i);
}
console.log(newArr);
// Variables needed declared outside the loops.
var quot = 0;
var loop = 1;
var n;
// Run code while n is not the same as the array length.
do {
quot = newArr[0] * loop * newArr[1];
for (n = 2; n < newArr.length; n++) {
if (quot % newArr[n] !== 0) {
break;
}
}
**console.log(quot);**
loop++;
} while (n !== newArr.length);
return quot;
}
smallestCommons([1, 13])
Your browser information:
User Agent is: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
.
Link to the challenge:
https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/smallest-common-multiple/
This code returns error “smallestCommons([23, 18]) should return 6056820”
If i remove the line “console.log(quot);” however, it works. Please help me understand this behaviour? Thank you.
FCC uses a timeout as an infinite loop/recursion protection (so campers don’t crash their browsers). It sounds like you solution is right on the edge of being efficient enough to finish within the timeout, so adding the extra command of a console.log
prevents it from finishing in enough time.
1 Like
Thanks so much. I googled the hell out of this and was none the wiser Crystal clear now.
Glad I could help. Happy coding!
1 Like
Thank you. While I have your attention , can i trouble u with a math question? can you guide me to some resource on a section of the logic used above? Specifically, why is the LCM always a multiple of the product of the highest two numbers in the array. Is this being assumed as most probable, or is this always true for two consecutive numbers?
The LCM will always be a multiple of the two highest numbers because the LCM must be a divisible by all numbers in the group, including the last two.
For example: 3, 4, 5
must be divisible by 4
and 5
. The smallest number that is is divisible by 4
and 5
is 20
. That isn’t divisible by 3
, so we have to check a larger number. Since it still must be divisible by 4
and 5
, the next smallest number we could check is 2*4*5
which is the same as 2*20
. And so on.
Maybe expirimenting with something like an LCM calculator might help? I think I’ve seen some that even step through the logic for more than 2 numbers.
1 Like
I’m not entirely sure what you mean by “we are confidently skipping over all the numbers between the multiples”, but maybe this StackExchange thread is what you’re looking for.
1 Like
i will follow that link , thank you…i mean that if the array is of larger non-prime numbers, is it not possible that the lcm of a given range may not be a multiple of the largest two numbers only? If the numbers share factors? Conversely I find it fascinating that this is so if always true. There is probably a trivial mathematical explanation that i just cant comprehend for now. I shoulda paid more attention in high school Thanks again for ur help