正在做一道求[min, ..., max]
的数字列表的最小公倍数LCM
的题,我的思路是先求出列表中前两个数a
和b
的最大公约数GCD
,然后由公式LCM = a * b / GCD
得到最小公倍数,再求前两个数的最小公倍数和第三个数的最小公倍数,以此类推至最后一个数:
array = [12, 24, 36];
GCD(12, 24) = 2;
//LCM = a * b / GCD
LCM(12, 24) = 24;
LCM(LCM(12, 24), 36) = 72;
LCM(12, 24, 36) = 72;
Code:
function smallestCommons(arr) {
var max = arr[arr.length-1];
var num = [];
// Get the Numlist of min to max
for(var min=arr[0],i=0; i<max; i++){
num[i] = min;
min++;
}
// Function of GCD
function gcd(a, b) {
var tmp;
while(tmp !== 0) {
tmp = a % b;
a = b;
b = tmp;
}
return a;
}
// Function of LCM
function lcm(a, b) {
var mult = a * b;
return mult / gcd(a, b);
}
// Get the LCM of the number list
var len = num.length;
var x = num[0];
for (var j = 0; j < len; j++) {
var NextNum = num[j+1];
var tmp = lcm(x, NextNum);
x = tmp;
}
return x;
}
smallestCommons([1,5]);
在Pythontutor上调试的时候,在出错的前一步可以看到函数结果得到了LCM(1, 2, 3, 4, 5) = 60
,但是无法返回结果并且在GCD
函数的while
循环出现死循环,找不出原因。
学编程不久,代码格式和思路都比较乱,前辈们有什么意见尽管指出,谢谢。
问题出在这里。你应该写
你的那种写法,到了j==len-1的时候,NextNum是undefined,然后你就死循环了。
为了能够在将来熟练地指出这样的错误,请背诵Javascript真值表(贴出来的只是冰山一角):

==
===
if