Divide Two Integers

描述

Divide two integers without using multiplication, division and mod operator.

分析

不能用乘、除和取模,那剩下的,还有加、减和位运算。

最简单的方法,是不断减去被除数。在这个基础上,可以做一点优化,每次把被除数翻倍,从而加速。

注意,写代码的时候,禁止使用 long.

代码

  1. // Divide Two Integers
  2. // 时间复杂度O(logn),空间复杂度O(1)
  3. public class Solution {
  4. public int divide(int dividend, int divisor) {
  5. if(dividend == 0) return 0;
  6. if (divisor == 0) return Integer.MAX_VALUE;
  7. // 当 dividend = INT_MIN,divisor = -1时,结果会溢出
  8. if (dividend == Integer.MIN_VALUE) {
  9. if (divisor == -1) return Integer.MAX_VALUE;
  10. else if (divisor < 0)
  11. return 1 + divide(dividend - divisor, divisor);
  12. else
  13. return - 1 + divide((dividend + divisor), divisor);
  14. }
  15. if(divisor == Integer.MIN_VALUE){
  16. return dividend == divisor ? 1 : 0;
  17. }
  18. int a = dividend > 0 ? dividend : -dividend;
  19. int b = divisor > 0 ? divisor : -divisor;
  20. int result = 0;
  21. while (a >= b) {
  22. int c = b;
  23. for (int i = 0; a >= c;) {
  24. a -= c;
  25. result += 1 << i;
  26. if (c < Integer.MAX_VALUE / 2) { // prevent overflow
  27. ++i;
  28. c <<= 1;
  29. }
  30. }
  31. }
  32. return ((dividend^divisor) >> 31) != 0 ? (-result) : (result);
  33. }
  34. }

原文: https://soulmachine.gitbooks.io/algorithm-essentials/content/java/simulation/divide-two-integers.html