您的位置:首页 > 其它

LeetCode刷题笔记(模拟):divide-two-integers

2018-02-02 20:06 393 查看
转载请注明作者和出处:http://blog.csdn.net/u011475210

代码地址:https://github.com/WordZzzz/Note/tree/master/LeetCode

刷题平台:https://www.nowcoder.com/ta/leetcode

题  库:Leetcode经典编程题

编  者:WordZzzz

题目描述

解题思路

C版代码实现

题目描述

Divide two integers without using multiplication, division and mod operator.

不用乘法,除法和取模运算符来计算两个整数相除的结果。

解题思路

假设我们要划分15和3,所以15是dividend、3是divisor。那么划分只需要我们找出可以从dividend中减去多少次divisor,而不会造成dividend负面影响。

首先是15-3=12,然后让我们尝试去减去更多。3左移一位得6,15-6=9。6左移一位是12,15-12=3。当我们再次对12进行左移得到24时,已经比15大了,所以15最多可以减去12。12是3的四倍,那么我们怎么得到这个4呢?其实我们可以在3(cur)左移的时候,对1(multiple)进行同样的左移操作即可,这样,当cur成为12的时候,multiple正好是4。

接下来,把15-12剩下的3再次进行循环,得出multiple为1,所以最后得到4+1=5次。

根据问题陈述,我们需要处理一些例外,例如溢出。

那么有两种情况可能会导致溢出:

divisor = 0;

dividend = INT_MIN和divisor = -1(因为abs(INT_MIN) = INT_MAX + 1)。

当然,我们也需要考虑相对容易的标志。

C++版代码实现

class Solution {
public:
int divide(int dividend, int divisor) {
if(!divisor || dividend == INT_MIN && divisor == -1)
return INT_MAX;
long long dvd = labs(dividend);
long long dvs = labs(divisor);
int res = 0;
while(dvd >= dvs){
long long cur = dvs, multiple = 1;
while(dvd >= cur << 1){
cur <<= 1;
multiple <<= 1;
}
dvd -= cur;
res += multiple;
}
return ((dividend < 0) ^ (divisor < 0)) ? -res : res;
}
};


系列教程持续发布中,欢迎订阅、关注、收藏、评论、点赞哦~~( ̄▽ ̄~)~

完的汪(∪。∪)。。。zzz
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Leetcode Simulation