29. Divide Two Integers内容如下:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
对于一般的32位OS,int 4字节 范围:2^31--2^31-1即-2147483648(INT_MIN) ~ +2147483647(INT_MAX)
long 4字节
long long 8字节
其设计思想:
如果被除数大于或等于除数,则进行如下循环,定义变量temp1等于除数,定义计数t,当t的两倍小于等于被除数tmp时,进行如下循环,temp1扩大一倍,t扩大一倍;
再对被除数减去上一步所得tmp1作为新的被除数
例如24/7
7*2^1=14,此时tmp1=20,t=2;
剩余的24-14=10作为新的被减数,通过每次减去减数对结果进行更新。
这道题的OJ给的一些test case非常的讨厌,因为输入的都是int型,比如被除数是-2147483648,在int范围内,当除数是-1时,结果就超出了int范围,需要返回INT_MAX,所以对于这种情况我们就在开始用if判定,将其和除数为0的情况放一起判定,返回INT_MAX。然后我们还要根据被除数和除数的正负来确定返回值的正负,这里我们采用长整型long来完成所有的计算,最后返回值乘以符号即可。
代码:
int divide(int dividend, int divisor) {
if(divisor==0||(dividend==INT_MIN&&divisor==-1))return INT_MAX;
int sign = 1;
if(dividend<0) sign = -sign;
if(divisor<0) sign = -sign;
unsigned long c = 1;
unsigned long long tmp = abs((long long)dividend);
unsigned long long tmp2 = abs((long long)divisor);
while(tmp>tmp2){
tmp2 = tmp2<<1;
c=c<<1;
}
int result =0;
while(tmp>=abs((long long) divisor)){
while(tmp>=tmp2){
tmp = tmp - tmp2;
result += c;
}
tmp2 = tmp2>>1;
c=c>>1;
}
return sign*result;
}