![](/img/trans.png)
[英]Javascript random addition and subtraction generator that prevents running negative numbers
[英]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.