leetcode Divide Two Integers
2015-02-11 21:50
453 查看
题目:https://oj.leetcode.com/problems/divide-two-integers/
题意:用减法和位运算代替除法
思路:这题太恶心了,最难的是边界问题,所以真正意义来讲我自己还没做出来,只是最后加了一堆if条件专门限制了一下边界时的情况
1.如果只用减法一点点用被除数减去除数那肯定超时,所以用到了一个将除数一倍一倍放大的思路,也就是2分法,举例来说,如果被除数是23,除数是4,那么2*4小于23,就将除数提高一倍,2*8也小于23,再翻倍发现2*16大于23了,那么这次翻倍就不算,前面将除数翻倍成8了对吧?也就是除数在位运算上,左移了2位,1->10->100,也就是十进制里的4,这么看来除数4,乘以刚才的位运算4,正好是16,是小于23,并且再翻倍会大于23
2.那么剩下的是23-16=7,再去递归的进行刚才的运算,将刚才的位移结果4加上这次位移结果——应该是1,也就是说一次位移都没有,那么4+1=5就为最后结果
3其实每次的移位操作,就是平时用的乘以2或除以2,只不过移位效率高,这道题的思路就是相当于把用被除数一点点减去除数,变成逐步增大地去减除数,这样效率会提升,并且细细想一下就是一位移就将除数*2,一递归就相当于除数加了一个新的部分
代码:
题意:用减法和位运算代替除法
思路:这题太恶心了,最难的是边界问题,所以真正意义来讲我自己还没做出来,只是最后加了一堆if条件专门限制了一下边界时的情况
1.如果只用减法一点点用被除数减去除数那肯定超时,所以用到了一个将除数一倍一倍放大的思路,也就是2分法,举例来说,如果被除数是23,除数是4,那么2*4小于23,就将除数提高一倍,2*8也小于23,再翻倍发现2*16大于23了,那么这次翻倍就不算,前面将除数翻倍成8了对吧?也就是除数在位运算上,左移了2位,1->10->100,也就是十进制里的4,这么看来除数4,乘以刚才的位运算4,正好是16,是小于23,并且再翻倍会大于23
2.那么剩下的是23-16=7,再去递归的进行刚才的运算,将刚才的位移结果4加上这次位移结果——应该是1,也就是说一次位移都没有,那么4+1=5就为最后结果
3其实每次的移位操作,就是平时用的乘以2或除以2,只不过移位效率高,这道题的思路就是相当于把用被除数一点点减去除数,变成逐步增大地去减除数,这样效率会提升,并且细细想一下就是一位移就将除数*2,一递归就相当于除数加了一个新的部分
代码:
class Solution { public: long long divided(unsigned long long dividend,unsigned long long divisor){<span style="white-space:pre"> </span>//递归调用 if(divisor > dividend) return 0; long long re = 1; unsigned long long measure = divisor,left; while(measure <=dividend){ left=dividend - measure; measure<<=1; if(dividend <measure) break; else re<<=1; } return re + divided(left,divisor); } int divide(int dividend, int divisor) { unsigned long long _dividend = abs((long long)dividend); unsigned long long _divisor = abs((long long)divisor); if(_divisor > _dividend) return 0; bool isNeg =true; if(dividend >= 0 && divisor > 0 || dividend <= 0 && divisor < 0) isNeg = false; long long result ; if(divided(_dividend,_divisor)>INT_MAX && isNeg == false) return INT_MAX;<span style="white-space:pre"> </span>//这里注意边界条件,很麻烦 if(isNeg) return (-1)*divided(_dividend,_divisor);; return divided(_dividend,_divisor); } };
相关文章推荐
- leetcode第一刷_Divide Two Integers
- 【leetcode】29. Divide Two Integers
- LeetCode 29 Divide Two Integers (不使用乘法,除法,求模计算两个数的除法)
- [LeetCode]题解(python):029-Divide Two Integers
- LeetCode 29. Divide Two Integers 二进制分解
- LEETCODE: Divide Two Integers
- Leetcode 29. Divide Two Integers
- [LeetCode] 数学计算模拟类问题:加法,除法和幂,注意越界问题。题 剑指Offer,Pow(x, n) ,Divide Two Integers
- leetcode: 29. Divide Two Integers [✗]
- LeetCode 029 Divide Two Integers
- LeetCode-Divide Two Integers
- leetcode: Divide Two Integers
- LeetCode | Divide Two Integers
- LeetCode Divide Two Integers
- [leetcode: Python]29. Divide Two Integers
- LeetCode题解:Divide Two Integers
- leetcode 29. Divide Two Integers
- LeetCode刷题笔记(模拟):divide-two-integers
- LeetCode: Divide Two Integers
- Leetcode29 Divide Two Integers