Description:
Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.
Return the quotient after dividing dividend by divisor.
The integer division should truncate toward zero.
Example 1:
Input: dividend = 10, divisor = 3
Output: 3
Example 2:
Input: dividend = 7, divisor = -3
Output: -2
Note:
- Both dividend and divisor will be 32-bit signed integers.
- The divisor will never be 0.
- Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231−1]. For the purpose of this problem, assume that your function returns 231−1 when the division result overflows.
题意:实现两个整数的除法;需要注意的是要求不可以使用乘法、除法和取余操作;并且结果是向0的方向取整;
第一种解法(超时):我们可以使用加法来模拟乘法,a/b=c,相当于求解b*c=a;我们需要计算要相加多少次才能接近被除数;
class Solution {
public int divide(int dividend, int divisor) {
int symbol = 0;
long _divisor = divisor;
long _dividend = dividend;
if(dividend < 0){
symbol--;
_dividend = 0 - (long)dividend;
}
else
symbol++;
if(divisor < 0){
symbol--;
_divisor = 0 - (long)divisor;
}
else
symbol++;
int quotient = _divisor <= _dividend ? 1 : 0;
long base = _divisor;
while(_divisor + base < _dividend){
quotient++;
_divisor += base;
}
return symbol == 0 ? 0 - quotient : quotient;
}
}
第二种解法:利用上面的解法会产生超时的可能,因此,我们可以利用位运算来缩短时间,每次将除数左移一位(扩大两倍)与被除数比较,直到移位后的除数小于或等于被除数,此时再将被除数减去移位后的除数再次进行移位比较,最后得到整除的商;
class Solution {
public int divide(int dividend, int divisor) {
if(dividend == Integer.MIN_VALUE && divisor == -1){
return Integer.MAX_VALUE;
}//the division result overflows
if(divisor == 0){
return -1;
}//divisor is zero
int symbol = dividend >> 31 == divisor >> 31 ? 1 : -1;//symbol of result
long _dividend = Math.abs((long)dividend);
long _divisor = Math.abs((long)divisor );
if(_dividend == 0 || _divisor > _dividend){
return 0;
}
int quotient = 0;//the result
while(_divisor <= _dividend){
long divisorTemp = _divisor;
long quotientTemp = 1;
while((divisorTemp << 1) <= _dividend){
divisorTemp <<= 1;
quotientTemp <<= 1;
}
quotient += quotientTemp;
_dividend -= divisorTemp;
}
return quotient * symbol;
}
}