JavaScript函数将两个数相乘,直到它们彼此相等

时间:2013-10-11 04:52:15

标签: javascript

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

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;
        }
    }

3 个答案:

答案 0 :(得分:4)

这将始终返回0,因为i0开始,因此result1将为0而result2将为0.

要查找LCM,您需要测试不同的产品组(例如,在LCM(12, 18)的情况下,您需要将18乘以2和{{1} } 12)。

一种方法是:

3

答案 1 :(得分:0)

您的解决方案存在的问题是,虽然result1result2可能在不同时间持有相同的值,但它们只会在的同时共享相同的值 >您的原始输入onetwo相同。因为返回条件依赖于这两个值的等价性,所以最终得到的函数仅在one==two时返回。输入35的循环示例为

  1. i = 0,result1 = 0,result2 = 0
  2. i = 1,result1 = 3,result2 = 5
  3. i = 2,result1 = 6,result2 = 10
  4. ... ad infinitum,其中result1永远不等于result2

    更好的解决方案将采用值a(其中a是具有最低绝对值的参数)并重复将数字添加到自身,直到总和ret完全可分由ab组成。我们可以使用modulo operator来检查这种情况。这种方法还允许我们在必要时计算“负最低公倍数”:

    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
    

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

答案 2 :(得分:-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...