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.
这个题的意思是在不使用乘除和取模运算的情况下进行除运算。
1)
class Solution {
public int divide(int dividend, int divisor) {
if(divisor == 0 || (dividend == Integer.MIN_VALUE && divisor == -1)){
return Integer.MAX_VALUE;
}
int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;//判断两个数中是否存在负数,存
在的话结果为false,不存在的话为true
long m = Math.abs((long)dividend);//直接对正整数进行运算
long n = Math.abs((long)divisor);
long res = 0;
if(n == 1){
return sign == -1 ? (int)m * -1 : (int)m;//标记正负号
}
while(m >= n){
long t = n,sum = 1;
while(m >= (t << 1)){//进行简便计算
t <<= 1;
sum <<= 1;
}
res += sum;
m -= t;
}
return sign == -1 ? (int)res * -1 : (int)res;//最后的时候将符号加到原来的值上面。
}
}
2)
class Solution {
public int divide(int dividend, int divisor) {
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
long ret = 0;
while (a >= b) {
for (long tmp = b, cnt = 1; a >= tmp; tmp <<= 1, cnt <<= 1) {
ret += cnt;
a -= tmp;
}
}
ret = (((dividend ^ divisor) >> 31) & 1) == 1 ? -ret: ret;
if (ret > Integer.MAX_VALUE || ret < Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
}
return (int)ret;
}
}
使用了位的表示法(32位)。