首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只用减法递归除法--不能处理小数。

只用减法递归除法--不能处理小数。
EN

Stack Overflow用户
提问于 2015-10-01 21:36:51
回答 3查看 1.3K关注 0票数 2

我正在练习我的数学/算法技能,并试图用减法将两个数字除以。我很接近,但我似乎处理不了小数,我不知道为什么?在堆栈的最低层,当我调用除法(9,2)时,我注意到我正在返回"0",而实际上我想返回1/2 -但不使用除法运算符.如果x小于y检查,我应该在子程序中添加这个逻辑吗?我一直在讨论如何在小数点后递归地把数字加到三位。

代码语言:javascript
复制
    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;

    };
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-02 06:07:54

你会认为这是作弊吗?没有除法或乘法,加法被转化为减法,它返回一个浮点数,并使用递归。但是,有相当数量的字符串转换正在进行,以连接数字并添加符号和小数点。

代码语言:javascript
复制
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));

票数 2
EN

Stack Overflow用户

发布于 2015-10-01 21:43:16

这是因为当x小于y时,你会返回0。然而,这恰恰是除奇数2的结果--在最后一步中,algo将尝试将1除以2。在这种情况下,您需要实现逻辑,而不是简单地返回0。

票数 1
EN

Stack Overflow用户

发布于 2015-10-02 02:31:45

如果您不反对浮点错误,这将发挥作用,而不是一个/*,甚至在视线中的+

您可以设置精度,但再加几位数,速度就会慢得令人讨厌。

它的工作原理是将商设为x,然后重复地将y从x和y-1的微小部分中移除,直到x为0,商数为x/y。

代码语言:javascript
复制
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));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32897271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档