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     }

 

posted @ 2019-10-20 08:23  dodoBehind  阅读(146)  评论(0编辑  收藏  举报