原题网址:https://leetcode.com/problems/divide-two-integers/
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
方法一:使用长整数处理溢出问题。public class Solution {
public int divide(int dividend, int divisor) {
if (divisor == 0) return 0;
long ldividend = dividend;
long ldivisor = divisor;
boolean negative = false;
if (ldividend < 0) {
negative = !negative;
ldividend = -ldividend;
}
if (ldivisor < 0) {
negative = !negative;
ldivisor = -ldivisor;
}
if (ldividend < ldivisor) return 0;
long quotient = 1;
long sum = ldivisor;
while (ldividend - sum >= ldivisor) {
long tq = 1;
long tsum = ldivisor;
while (ldividend - sum - tsum - tsum >= 0) {
tq += tq;
tsum += tsum;
}
// System.out.println("tq=" + tq);
sum += tsum;
quotient += tq;
}
// System.out.println(quotient);
if (negative && -quotient <= Integer.MIN_VALUE) return Integer.MIN_VALUE;
else if (!negative && quotient >= Integer.MAX_VALUE) return Integer.MAX_VALUE;
if (negative) return (int)-quotient;
return (int)quotient;
}
}
方法二:分情况处理溢出问题。
public class Solution {
/*
好多坑,要测试{-最大值,-1,0,1,+最大值}的各种组合
10
-3
-200000
1
-214748364
2
2147483647
1
-2147483648
2
-2147483648
-2147483648
-1
-1
-2147483648
-1
*/
public int divide(int dividend, int divisor) {
if (dividend == 0) return 0;
if (divisor == 0) return Integer.MAX_VALUE;
if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;
int HALF_POSITIVE = Integer.MAX_VALUE >> 1;
int HALF_NEGATIVE = Integer.MIN_VALUE >> 1;
// System.out.printf("HALF_NEGATIVE=%d\n", HALF_NEGATIVE);
int quotient = 0;
if (dividend > 0) {
if (divisor > 0) {
while (dividend - divisor >= 0) {
int m = divisor;
int p = 1;
while (m <= HALF_POSITIVE && dividend - m - m >= 0) {m += m; p += p;}
quotient += p;
dividend -= m;
if (dividend == 0) break;
}
} else {
while (dividend + divisor >= 0) {
int m = divisor;
int p = -1;
while (m >= HALF_NEGATIVE && dividend + m + m >= 0) { m += m; p += p;}
quotient += p;
dividend += m;
if (dividend == 0) break;
}
}
} else {
if (divisor > 0) {
while (dividend + divisor <= 0) {
int m = divisor;
int p = -1;
while (m <= HALF_POSITIVE && dividend + m + m <= 0) { m += m; p += p;}
quotient += p;
dividend += m;
if (dividend == 0) break;
}
} else {
while (dividend - divisor <= 0) {
int m = divisor;
int p = 1;
while (m >= HALF_NEGATIVE && dividend - m - m <= 0) { m += m; p += p;}
quotient += p;
dividend -= m;
if (dividend == 0) break;
}
}
}
return quotient;
}
}