给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3示例 2:输入: dividend = 7, divisor = -3
输出: -2说明:被除数和除数均为 32 位有符号整数。
除数不为 0。假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。思路:
1.先判断除完之后结果溢出的情况,只有在MIN_VALUE,且除数为-1时,求得结果将会大于MAX_VALUE,其他情况下不会产生溢出的情况2.当被除数和除数都为0时,结果只能为03.由于负数除法需要记录符号位的变化,所以当两数符号不同时要标记,在最后结果取反,这时就可以将两个数都取正整数进行运算4.
private static int day1024DivideTwoIntegers(int dividend, int divisor){ //特殊情况,即会溢出的情况 if (dividend == Integer.MIN_VALUE&&divisor == -1) { return Integer.MAX_VALUE; } if(dividend == 0 || divisor == 0) return 0; boolean flag = false; if((dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0)) flag = true; long c = dividend; long d = divisor; //相当于 (c>0)?c:-c //import static java.lang.Math.abs; long a = abs(c); long b = abs(d); long sum = 0; int count = 0; int n = 0; //核心算法 while(a >= b){ sum = b; count = 1; while(sum + sum <= a){ sum += sum; count += count; } a -= sum; n += count; } if(flag) return -n; return n;}