LeetCode 29. 两数相除 时间击败【100.00%】 内存击败【76.25%】
不禁让我想起了计算机是怎样进行除法运算的,单独考虑溢出以及边界情况,单独考虑符号,其他过程和我们小学除法是一模一样的:左移除数(十进制就是扩大十倍,二进制扩大两倍),直到正好比被除数小,一边累加商(在我的代码里就是33行)一边减小被除数,直到被除数不能减小,右移除数,重复上述过程。
1 public int divide(int dividend, int divisor) { 2 if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE; 3 if (dividend == Integer.MIN_VALUE && divisor == Integer.MIN_VALUE) return 1; 4 if (divisor == Integer.MIN_VALUE) return 0; 5 6 int ans = 0, neg = 0; 7 if (dividend == Integer.MIN_VALUE) { 8 if (divisor < 0) dividend -= divisor; 9 else dividend += divisor; 10 ans++; 11 if (dividend >= 0) neg ^= 1; 12 } 13 if (dividend < 0) { 14 neg ^= 1; 15 dividend *= -1; 16 } 17 if (divisor < 0) { 18 neg ^= 1; 19 divisor *= -1; 20 } 21 if (dividend < divisor) return neg == 1 ? -ans : ans; 22 23 int res = 1; 24 while (divisor <= dividend / 10) { 25 divisor *= 10; 26 res *= 10; 27 if (dividend == divisor && dividend == 0) return neg == 1 ? -ans : ans; 28 } 29 30 while (divisor != 0) { 31 while (dividend >= divisor) { 32 dividend -= divisor; 33 ans += res; 34 } 35 while (dividend < divisor) { 36 divisor /= 10; 37 res /= 10; 38 } 39 } 40 return neg == 1 ? -ans : ans; 41 }