leetcode Divide Two Integers
来源:互联网 发布:淘宝一千零一夜第二季 编辑:程序博客网 时间:2024/05/20 08:01
题目: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,一递归就相当于除数加了一个新的部分
代码:
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); }};
0 0
- LeetCode: Divide Two Integers
- [LeetCode]Divide Two Integers
- LeetCode: Divide Two Integers
- [LeetCode] Divide Two Integers
- [Leetcode] Divide Two Integers
- LeetCode Divide Two Integers
- 【leetcode】Divide Two Integers
- [LeetCode]Divide Two Integers
- LeetCode-Divide Two Integers
- LeetCode: Divide Two Integers
- Divide Two Integers - leetcode
- Leetcode: Divide Two Integers
- LeetCode:Divide Two Integers
- leetcode Divide Two Integers
- LeetCode Divide Two Integers
- LeetCode | Divide Two Integers
- Leetcode: Divide Two Integers
- Divide Two Integers -- LeetCode
- STL里的multimap使用简介
- find_last_of()
- 高等几何——周兴和答案2(自己写的,非标准答案,望指正)
- HDU1247--Hat’s Words【STL--map】
- UVa1596 - Bug Hunt
- leetcode Divide Two Integers
- cookie、session、sessionid 与jsessionid
- 分书问题
- uva 10057 A mid-summer night’s dream(中位数)
- Android之fragment介绍及fragment详解
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxError Exception
- 解决android开发中eclipse不能自动提示
- 用jquery解析JSON数据的方法
- Unity技巧集合