solution:此题的解法是不断左移divisor和dividend比较大小,先减掉最接近dividend的值,然后右移divisor再减次接近的值,直到dividend为0(表示整除)或者有余数。
需要注意的地方是:
1,保存除数与被除数的正负值,然后取绝对值进行循环;
2,由于INT_MIN=-2147483648的存在,我们会发现abs(INT_MIN) == INT_MIN, 因此要将其转换为long long 型,中间先有转换为usinged int, 这样也可以。
3,各种边界条件,如被除数为0,除数为0。
class Solution {
public:
int divide(int dividend, int divisor) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if( divisor == 0 )
return -1;
if( dividend == 0 )
return 0;
int positive = 1;
if(divisor < 0) // 保存正负值信息
positive *= -1;
if(dividend < 0)
positive *= -1;
long long divis = abs( (long long)divisor ); //用long long避免INT_MIN情况
long long divid = abs( (long long)dividend );
int index = 0;
unsigned int mul[32];
while(divis <= divid && divis > 0)
{
mul[ index ] = divis;
divis = divis << 1;
index ++;
}
index --;
unsigned int remain = 0;
while( index >= 0 && divid > 0)
{
if( mul[ index ] <= divid )
{
divid = divid - mul[ index ];
remain += ( 1<<index );
}
index --;
}
if(positive < 0)
return -remain;
return remain;
}
};