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
原创粉丝点击