29.两数相除
思路:用除数divisor的2的倍数去减dividend,直到除数divisor比剩余的被除数d1大为止。时间复杂度应该是0(logn)
class Solution {
public:
int divide(int dividend, int divisor) {
long long flag=-1;
if(dividend>=0&&divisor>0 || dividend<0&&divisor<0) flag=1;
long long sum=0;
long long d1=abs((long long)dividend);
long long d2=abs((long long)divisor);
long long tmp=1;
while(1){
while(d2<=d1){
d1=d1-d2;
d2<<=1;
sum+=tmp;
tmp<<=1;
}
d2=abs((long long)divisor);
tmp=1;
if(d1<d2) break;
}
if(sum*flag>INT_MAX) return INT_MAX;
else if(sum*flag<INT_MIN) return INT_MIN;
else return (int)sum*flag;
}
};