码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 29. 两数相除 时间击败【100.00%】 内存击败【76.25%】

时间:2019-10-20 11:18:16      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:溢出   value   val   计算   进制   viso   ++   res   和我   

 

不禁让我想起了计算机是怎样进行除法运算的,单独考虑溢出以及边界情况,单独考虑符号,其他过程和我们小学除法是一模一样的:左移除数(十进制就是扩大十倍,二进制扩大两倍),直到正好比被除数小,一边累加商(在我的代码里就是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     }

 

LeetCode 29. 两数相除 时间击败【100.00%】 内存击败【76.25%】

标签:溢出   value   val   计算   进制   viso   ++   res   和我   

原文地址:https://www.cnblogs.com/towerbird/p/11706661.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!