给定两个整数,被除数 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时,结果只能为0
3.由于负数除法需要记录符号位的变化,所以当两数符号不同时要标记,在最后结果取反,这时就可以将两个数都取正整数进行运算
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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。