【问题标题】:Multiply two numbers without using multiplication [closed]不使用乘法将两个数字相乘[关闭]
【发布时间】:2016-07-27 09:00:00
【问题描述】:

我有一个测试,我需要在不使用乘法的情况下编写两个数字相乘的代码,

代码如下,

function multiply(num,toNum){
  var product = 0;
  for(var i = 1; i <= toNum; i++){
    product += num;
  }

  return product;
}

console.log(multiply(2,5)); 

输出是

rahul@rahul:~/myPractise/Algo$ node MultiplyWithoutLoop.js 
10 
rahul@rahul:~/myPractise/Algo$ 

以上代码是否令人满意或需要改进的地方。

能否应用更好的逻辑。

嘿,

我用递归解决了,

这是代码,

function multiply01(num,toNum){
  var product = num;    
  return (toNum >= 1) ? product + multiply01(product,--toNum) : 0; 
}

【问题讨论】:

  • 如果这能正常工作,你最好在codereview.stackexchange.com 上发布它,但一种更好的方法是在循环中使用较小的数字
  • 我投票结束这个问题,因为它是关于代码审查的,因为它是关于代码审查的——我们可以把它移到那里吗?

标签: javascript data-structures logic


【解决方案1】:

紧凑的方式:

function multiply(a, b) {
  return a / (1 / b);
}

console.log(multiply(2, 5)); // 10

【讨论】:

  • 哈哈,看来是有效的:D
  • b = 0 上的错误结果
  • 需要特殊情况来处理b 为0,但除此之外,这是赢家。我会选择三元组。
  • b == 0 真的需要特殊情况吗?当return a / (1 / b); 没有返回预期结果时,有人可以提供参数的准确值吗?
  • @Pimgd 正是 IEEE754 中描述的内容。一个提示:如果你在继续这个对话之前尝试一下呢? 1 / (1 / 0) --- 你认为它会返回什么?另一个提示:它会完全按照预期返回 0
【解决方案2】:

您可以对奇数和位移位使用加法。更广为人知的是Ancient Egyptian multiplication

如果a 是奇数,则将b 的值相加。然后a除以2,分配整数部分。 b 翻倍。

例子:

 a    b   sum
---  ---  ---
  5    4    4  add 4
  2    8    4
  1   16   20  add 16
  0   32   20  <- result

function multiply(a, b) {
    var sum = 0;
    while (a) {
        if (a & 1) {
            sum += b;
        }
        a >>= 1;
        b <<= 1;
    }
    return sum;
}

console.log(multiply(5, 4));
console.log(multiply(3, 7));
console.log(multiply(191, 7));

【讨论】:

    【解决方案3】:

    请试试这个,它也能处理负值

    function multiply(x, y)
    {
        /* Add x one by one */
        if(y > 0 )
        {
            return (x + multiply(x, y-1));
        }
    
        /* the case where y is negative */
        else if(y < 0 )
        {
            return -multiply(x, -y);
        }
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      相关资源
      最近更新 更多