Leetcode 29 Divide Two Integers
阿新 • • 發佈:2018-12-17
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位)。