题目:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题解:只能用移位运算,以2为基模拟除法。
边界情况: divisor == 0 ==> result = INT_MAX, dividend == INT_MIN, divisor == -1 溢出 ==> result = INT_MAX
dividend == INT_MIN,divisor != -1:
dividend -= abs(divisor), result++。
用base表示基,求divisor不大于dividend的最大值,然后dividend减去divisor,更新result, base和divisor。
C++版:
class Solution {
public:
int divide(int dividend, int divisor) {
if(divisor == 0)
return INT_MAX;
bool isNeg = abs((dividend ^ divisor) >> 31);
int result = 0;
if(dividend == INT_MIN) {
if(divisor == -1)
return INT_MAX;
dividend += abs(divisor);
result++;
}
if(divisor == INT_MIN)
return result;
dividend = abs(dividend);
divisor = abs(divisor);
int base = 0;
while(divisor <= (dividend >> 1)) {
divisor <<= 1;
base++;
}
while(base >= 0) {
if(dividend >= divisor) {
result += (1 << base);
dividend -= divisor;
}
divisor >>= 1;
base--;
}
return isNeg ? -result : result;
}
};
Java版:
public class Solution {
public int divide(int dividend, int divisor) {
if(divisor == 0)
{
return Integer.MAX_VALUE;
}
boolean isNeg = (dividend^divisor)>>>31 == 1;
int res = 0;
if(dividend == Integer.MIN_VALUE)
{
dividend += Math.abs(divisor);
if(divisor == -1)
{
return Integer.MAX_VALUE;
}
res++;
}
if(divisor == Integer.MIN_VALUE)
{
return res;
}
dividend = Math.abs(dividend);
divisor = Math.abs(divisor);
int digit = 0;
while(divisor <= (dividend>>1))
{
divisor <<= 1;
digit++;
}
while(digit>=0)
{
if(dividend>=divisor)
{
res += 1<<digit;
dividend -= divisor;
}
divisor >>= 1;
digit--;
}
return isNeg?-res:res;
}
}
Python版:
class Solution:
# @param {integer} dividend
# @param {integer} divisor
# @return {integer}
def divide(self, dividend, divisor):
if divisor == 0:
return sys.maxint
if dividend == -2147483648 and divisor == -1:
return 2147483647
isNeg = abs((dividend ^ divisor) >> 31)
dividend = abs(dividend)
divisor = abs(divisor)
result, base = 0, 0
while divisor <= (dividend >> 1):
divisor <<= 1
base += 1
while base >= 0:
if dividend >= divisor:
result += (1 << base)
dividend -= divisor
divisor >>= 1
base -= 1
return -result if isNeg else result