题目:
思路:用减法,被除数能减多少次除数,商就是多少。除数每左移一次相当于乘一次2。
代码:
class Solution {
public:
int divide(int dividend, int divisor) {
long newdividend = dividend;
long newdivisor = divisor;
long max = 0x80000000;
long min = -max;
long midValue = 0x40000000;//坑爹 一开始少个零
long d = 0;
if(newdivisor == -1 && dividend == min) return max-1 ; //溢出的情况
if(newdivisor == newdividend) return 1; // 这种情况下negative始终为0
bool negative = (dividend ^ divisor) > 0 ;//用异或来计算是否符号相异
newdividend = labs(dividend);
newdivisor = labs(divisor);
while(newdividend >= newdivisor )
{
long tempdividend = newdividend;
long tempdivisor = newdivisor;
long result = 1; //一开始用int不行。因为如果除数>midvalue时,会溢出,所以得用long
while(tempdividend >= tempdivisor )
{
tempdividend -= tempdivisor;
result = result*2;
tempdivisor = tempdivisor << 1;
}
}
newdividend = tempdividend;
d = d + result-1;
}
return negative >0 ? d : -d;
}
};