2015-10-01 47 views
2

我正在練習我的數學/算法技巧,並試圖只用減法來劃分兩個數字。我非常接近,但我似乎無法處理小數,我不知道爲什麼?在堆棧的最底層,當我調用divide(9,2)時,我注意到我返回「0」,實際上我想返回1/2 - 但不使用除法運算符... inside如果x小於y檢查,我應該在子程序中添加該邏輯嗎?我堅持如何遞歸地將小數點後面的數字添加到三個位置。只用減法遞歸劃分---不能處理小數

var divide = function(x, y) { 
     //the number of times you need to subtract y from x. 

     if (y === 0) { 
     return 0 
     } 
     // if 
     if (x - y === 0) { 
     return 1; 
     } 
     if (x < y) { 
    // if this is the case, get the value of y - x. ->1 
    var diff = y - x; 
    console.log(diff); 
    // add a zero to the end --> so in our case, 10 
    diff = String(diff) + '0'; 
    console.log(diff); 
    diff = Number(diff); 
    console.log(diff); 
    // is that now divisible by y? is so how many times? in our case, 5 times. 
    var decimal = Number(divide(diff, y)); 
    var number = "." + decimal; 
    //so add .5 to it. 
    return number; 
    } else { 
     return (1 + divide(x - y, y)); 
     } 

    }; 

    var modulo = function(x, y) { 

     var val = x; 
     while (val >= y) { 
     val -= y; 

     } 
     return val; 

    }; 
+0

你可能也想跟蹤餘以某種方式。 – ryanyuyu

+0

是的,我正在更新,以包括它的其餘部分 – devdropper87

回答

1

你會認爲這是作弊?沒有分割或乘法,加法被轉換爲減法,它返回一個浮點數,並使用遞歸。但是,有相當數量的字符串轉換正在進行,以連接數字並添加符號和小數點。

function divide(x, y, prec) { 
 
    if (y == 0) return NaN; 
 
    var quot = 0, sign = 1; 
 
    if (x < 0) { 
 
     sign = 0 - sign; 
 
     x = 0 - x; 
 
    } 
 
    if (y < 0) { 
 
     sign = 0 - sign; 
 
     y = 0 - y; 
 
    } 
 
    while (x >= y) { 
 
     x -= y; 
 
     quot = 0 - (0 - 1 - quot); 
 
    } 
 
    quot = (sign < 0 ? "-" : "").concat(quot, prec == undefined && x > 0 ? "." : ""); 
 
    if (x > 0) { 
 
     prec = prec || 13; 
 
     if (--prec) { 
 
      for (var i = 9, temp = x; i; i--) x = 0 - (0 - x - temp); 
 
      quot = quot.concat(divide(x, y, prec)); 
 
     } 
 
    } 
 
    return parseFloat(quot); 
 
} 
 

 
alert(divide(9, 2)); 
 
alert(divide(2, 9)); 
 
alert(divide(9, -2)); 
 
alert(divide(-2, 9)); 
 
alert(divide(-9, -2)); 
 
alert(divide(0, 9)); 
 
alert(divide(9, 0));

1

這是因爲happenning當x小於y將返回0。然而,這正是由2分割奇數結果 - 在最後一步,該算法中會嘗試除以2 1你需要實現在這種情況下的邏輯,而不是簡單地返回0。

+0

是的,我確定在我的問題。我能想到的唯一的事情就是返回x/y ....相當卡住了。 – devdropper87

+0

@ devdropper87:你可以通過在數字的末尾加上'0'來繼續分割(基本上乘以10)。所以你的餘數是1?加0,你得到10,除以2你得到5,所以這是小數點後,所以結果是0.5。 – slebetman

+0

@slebetman只有減法!乘法會作弊:-) – m69

0

如果你不反對浮點錯誤,這會做的伎倆,而不是/*或在視線甚至+
您可以設置精度,但更多的位數會變得令人生厭。

它通過將商設爲x,然後反覆從商和x和y-1小部分中除去y個微小部分,直到x爲0,商爲x/y。

function divide(x, y) { 
 
    var sign = x < 0^y < 0 ? -1 : 1; 
 
    x = y ? (x > 0 ? x : 0 - x) : -1; y = y > 0 ? y : 0 - y; 
 
    var quot = x, prec = 0.000001; 
 
    while (x > 0) for (var i = y - 1, x = x - prec; i; i--, x -= prec, quot -= prec); 
 
    return y ? (sign > 0 ? quot : 0 - quot) : NaN; 
 
} 
 

 
alert(divide(9, 2)); 
 
alert(divide(2, 9)); 
 
alert(divide(9, -2)); 
 
alert(divide(-2, 9)); 
 
alert(divide(-9, -2)); 
 
alert(divide(0, 9)); 
 
alert(divide(2, 0));