给你两个整数,被除数 dividend
和除数 divisor
。将两数相除,要求 不使用 乘法、除法和取余运算。
整数除法应该向零截断,也就是截去(truncate
)其小数部分。例如,8.345
将被截断为 8
,-2.7335
将被截断至 -2
。
返回被除数 dividend
除以除数 divisor
得到的 商 。
注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231, 231 − 1]
。本题中,如果商 严格大于 231 − 1
,则返回 231 − 1
;如果商 严格小于 -231
,则返回 -231
。
示例 1:
输入: dividend = 10, divisor = 3 输出: 3 解释: 10/3 = 3.33333.. ,向零截断后得到 3 。
public static int divide(int dividend, int divisor) { // 被除数 除数 // 溢出 if (divisor == -1 && dividend == Integer.MIN_VALUE) { return Integer.MAX_VALUE; } int sign = (dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0) ? -1 : 1; int a = dividend > 0 ? -dividend : dividend; int b = divisor > 0 ? -divisor : divisor; if (a > b) { return 0; } int ans = div(a, b); return sign == -1 ? -ans : ans; } public static int div(int a, int b) { if (a > b) { return 0; } int count = 1; int tb = b; // 溢出之后不再小于0 while (tb + tb >= a && tb + tb < 0) { tb += tb; count += count; } return count + div(a - tb, b); }