29. 两数相除

  1. class Solution {
  2. public int divide(int dividend, int divisor) {
  3. long result = 0;
  4. boolean isNeg = false;
  5. long x = dividend;
  6. long y = divisor;
  7. if ((dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0))
  8. isNeg = true;
  9. x = Math.abs(x);
  10. y = Math.abs(y);
  11. long left = 0;
  12. long right = x;
  13. while (left < right) {
  14. long mid = (left + right + 1) >> 1;
  15. if (quickMul(y, mid) <= x) {
  16. left = mid;
  17. } else {
  18. right = mid - 1;
  19. }
  20. }
  21. result = isNeg ? -left : left;
  22. if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE)
  23. return Integer.MAX_VALUE;
  24. return (int)result;
  25. }
  26. public long quickMul(long a, long b) {
  27. // 快速乘法, 本题中只考虑正数
  28. long result = 0;
  29. while (b > 0) {
  30. if ((b & 1) == 1) {
  31. result += a;
  32. }
  33. b >>= 1;
  34. a += a;
  35. }
  36. return result;
  37. }
  38. }