簡體   English   中英

在JavaScript中將兩個數字相乘,僅需加法和減法(無日志)

[英]Multiplying two numbers in JavaScript with only addition and subtraction (no logs)

我正在嘗試僅使用加法/減法將兩個數字相乘(用於算法練習,因為我是JavaScript新手)。 我使用它來處理日志,但是我只想嘗試加法/減法。 有沒有子例程(底部有addY函數)可以執行此操作嗎? 知道如何在不使用for循環的情況下做到這一點也將是很棒的!

var multiply = function(x, y) {

  //add y x times
  // function log10(val) {
  //     return Math.log(val) / Math.LN10;
  // }
  // return Math.round(Math.pow(10, (log10(x) + log10(y))))
  if(x === 1){
    return y;
  }
  if(y === 1){
    return x;
  }
  if (x === 0 || y === 0) {
    return 0;
  }
  //if one is negative
  if(x < 0 ^ y <0){
    return -multiply(Math.abs(x), Math.abs(y))
  }
  //if both are negative
  if(x<0 && y<0){
    return multiply(Math.abs(x), Math.abs(y));
  }

  //subroutine:
  var addY = function (x, y){
    var total= 0;
    for(var i = 0; i<x; i++){
        total += y;
    }
    return total;
  }

  return addY(x, y);
};

console.log(multiply(55, -2)) 
// ---> returns -110 woohoo!

如果要相乘,可以做一個循環:

for(var i = 0; i<y; i++){
    x +=x;
}

我使用while循環而不是for來完成此操作,但我認為您始終需要某種迭代。

var multiply = function(x, y) {
    if (y === 0) {
        return 0;
    }

    var minus = y < 0;

    if (minus) {
        y = -y;
    }

    var total = x;

    while (y > 1) {
        total += x;
        y--;
    }

    return minus ? -total : total;
}

正如其他人所指出的,如果使用循環,則乘法很容易。 唯一的警告是,您需要先使變量為正,然后才能使用循環將其累加,否則將引入無限循環的風險。

一種簡單的方法是在遇到負數時使用遞歸來切換符號。

function multiply(a, b) {
    if (a < 0) {
      return -(multiply(-a, b))
    } else if (b < 0) {
      return -(multiply(a, -b))
    } else {
      var total = 0;
      // math to calculate product goes here
      return total;
    }
  }

盡管這可能算作作弊,但由於-a在數學上等效於a * -1

編輯: Jiggszon建議執行0-a而不是-a以避免作弊。

無論如何,這是一個實現,因此您可以在實際中看到它:

 (function() { var x = document.getElementById("x"); var y = document.getElementById("y"); var z = document.getElementById("output"); document.getElementById("btnCalc").addEventListener("click", function() { z.innerHTML = multiply(+x.value, +y.value); }); function multiply(a, b) { if (a < 0) { return 0-(multiply(0-a, b)) } else if (b < 0) { return 0-(multiply(a, 0-b)) } else { var smallerNumber; var biggerNumber; if (a <= b) { smallerNumber = a; biggerNumber = b; } else { smallerNumber = b; biggerNumber = a; } var total = 0; for (var i = 0; i < smallerNumber; i++) { total += biggerNumber; } return total; } } })(); 
 <input type="button" id="btnCalc" value="Calculate" /> <input type="text" value=100 id="x" />x <input type="text" value=3 id="y" />= <span id="output"></span> 

上面代碼中唯一需要指出的是,在執行循環之前,它檢查變量中的一個是否小於另一個。 這樣一來,迭代次數越少越好!

 function multiply(x, y) { var product = 0, sign = x > 0 ? 1 : -1, y = x > 0 ? y : 0 - y; if (x && y) do product += y; while (x -= sign); return product; } alert(multiply( 5, 7)); alert(multiply(-5, 7)); alert(multiply( 5, -7)); alert(multiply(-5, -7)); alert(multiply( 0, 7)); alert(multiply( 5, 0)); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM