0

我正在尝试构建此函数以由用户传递两个数字,并找到这两个数字的最小公倍数。我试图通过使用这个逻辑来构建函数。继续相乘,直到两个数的结果相等。我需要一些关于逻辑的帮助。谢谢你。

function performCalc(one, two) {
        var num1 = new Number;
        var num2 = new Number;
        var i = new Number(0);

        var num1 = one;
        var num2 = two;

        var result1 = new Number;
        var result2 = new Number;

        do {
            result1 = num1 * i;
            result2 = num2 * i;
            i++
        }
        while (result1 != result2);
        if (result1 == result2) {
            return result1;
        }
    }
4

3 回答 3

4

这将始终返回 0,因为i从 开始0,所以result1将是 0 并且result2将是 0。

要找到 LCM,您需要测试不同的产品集(例如,在 的情况下,LCM(12, 18)您需要乘以182)。123

一种方法是:

var i,j;
for(i=1;i <= two; ++i) {
    for(j=1; j<=one; ++j) {
        if(one * i == two * j) { 
            return one * i;
        }
    }
}
于 2013-10-11T05:03:08.260 回答
0

您的解决方案的问题在于,虽然result1并且可能在不同时间持有相同的值,但如果您的原始输入和相同result2,它们只会同时共享相同的值。因为您的返回条件依赖于这两个值的等价性,所以您最终会得到一个仅返回 when 的函数。带有输入的循环示例,并且将是onetwoone==two35

  1. 我 = 0,结果 1 = 0,结果 2 = 0
  2. 我 = 1,结果 1 = 3,结果 2 = 5
  3. 我 = 2,结果 1 = 6,结果 2 = 10

... 无穷无尽,result1永远不等于result2

更好的解决方案是取一个值a(其中a是具有最低绝对值的参数)并重复将数字添加到自身,直到总和完全可以被和ret整除。我们可以使用模运算符来检查这种情况。如果需要,这种方法还允许我们计算“负最小公倍数”:ab

function lowest_common_multiple(a,b) {
    var max = Math.max(a,b),
        min = Math.min(a,b);
    if(Math.abs(max + min) <= Math.abs(max)) { 
        return 0;
    }
    var abs_min = (Math.abs(a) < Math.abs(b)) ? a : b;
    var ret = abs_min;
    while(1) {
        ret += abs_min; 
        if(!(ret % a || ret % b)) {
            return ret;
        }
    }
}

console.log(lowest_common_multiple(11,27));   // >> +297
console.log(lowest_common_multiple(-11,-27)); // >> -297

请注意,如果用户为任一(或两个)参数传入零,或者如果一个参数为正而另一个为负,则此实现返回零。

于 2013-10-11T05:51:14.013 回答
-2

也许这会成功:

do {
  result1 = num1 * i;
  result2 = num2 * i;

  if( result1 == result2 ){ break; }
  i++
}

return result1;

看起来,您的代码处于无限循环中,甚至可能使用类似的东西来限制迭代

i++;
if( i > 1000 ){  result1=0; break; } //if it tried 1000 times and found nothing, abort and return zero...
于 2013-10-11T04:59:47.250 回答