您的位置:首页 > 其它

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,一递归就相当于除数加了一个新的部分

代码:

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);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: