1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| public class Leetcode01_divide_two_integers {
public static int add(int a, int b) { int sum = a; while (b != 0) { sum = a ^ b; b = (a & b) << 1; a = sum; } return sum; }
public static int negNum(int n) { return add(~n, 1); }
public static int minus(int a, int b) { return add(a, negNum(b)); }
public static int multi(int a, int b) { int res = 0; while (b != 0) { if ((b & 1) != 0) { res = add(res, a); } a <<= 1; b >>>= 1; } return res; }
public static boolean isNeg(int n) { return n < 0; }
public static int div(int a, int b) { int x = isNeg(a) ? negNum(a) : a; int y = isNeg(b) ? negNum(b) : b; int res = 0; for (int i = 30; i >= 0; i = minus(i, 1)) { if ((x >> i) >= y) { res |= (1 << i); x = minus(x, y << i); } } return isNeg(a) ^ isNeg(b) ? negNum(res) : res; }
public static int divide(int a, int b) { if (a == Integer.MIN_VALUE && b == Integer.MIN_VALUE) { return 1; } else if (b == Integer.MIN_VALUE) { return 0; } else if (a == Integer.MIN_VALUE) { if (b == negNum(1)) { return Integer.MAX_VALUE; } else { int c = div(add(a, 1), b); return add(c, div(minus(a, multi(c, b)), b)); } } else { return div(a, b); } }
}
|