当前位置:  开发笔记 > 编程语言 > 正文

整数除法不使用/或*运算符

如何解决《整数除法不使用/或*运算符》经验,为你挑选了1个好方法。

我正在阅读算法和数据结构教科书,并提出了这个问题:

1-28.编写一个函数来执行整数除法而不使用/或*运算符.找到一种快速的方法来做到这一点.

我们怎样才能想出一个快速的方法呢?



1> mlunoe..:

我喜欢这个解决方案:https:|//stackoverflow.com/a/34506599/1008519 ,但我发现它有点难以推理(特别是-part).这个解决方案让我的头脑更有意义:

var divide = function (dividend, divisor) {
  // Handle 0 divisor
  if (divisor === 0) {
    return NaN;
  }

  // Handle negative numbers
  var isNegative = false;
  if (dividend < 0) {
    // Change sign
    dividend = ~dividend+1;
    isNegative = !isNegative;
  }

  if (divisor < 0) {
    // Change sign
    divisor = ~divisor+1;
    isNegative = !isNegative;
  }

  /**
   * Main algorithm
   */

  var result = 1;
  var denominator = divisor;
  // Double denominator value with bitwise shift until bigger than dividend
  while (dividend > denominator) {
    denominator <<= 1;
    result <<= 1;
  }

  // Subtract divisor value until denominator is smaller than dividend
  while (denominator > dividend) {
    denominator -= divisor;
    result -= 1;
  }

  // If one of dividend or divisor was negative, change sign of result
  if (isNegative) {
    result = ~result+1;
  }

  return result;
}

    我们将结果初始化为1(因为我们要将分母加倍,直到它大于股息)

    将我们的分母(按位移)加倍,直到它大于被除数

    既然我们知道我们的分母比我们的股息更大,我们可以减去我们的除数,直到它低于我们的股息

    返回结果,因为分母现在使用除数尽可能接近结果

以下是一些测试运行:

console.log(divide(-16, 3)); // -5
console.log(divide(16, 3)); // 5
console.log(divide(16, 33)); // 0
console.log(divide(16, 0)); // NaN
console.log(divide(384, 15)); // 25

以下是解决方案的要点:https://gist.github.com/mlunoe/e34f14cff4d5c57dd90a5626266c4130

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有