描述
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商
例子
思路
- 使用异或判断符号
a^a=0 True^True==0
- 使用减法来代替除法
可通过左移来加快速度 3*(2^3 + 2^1+2^0)+1=33
- 边界问题
使用long,(long在64位编译器下是8个字节,32位编译器下是4个字节)
答案
- python
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
#利用异或判断符号
flag = -1 if (dividend>0) ^ (divisor>0) else 1
dividend=abs(dividend)
divisor=abs(divisor)
c=0
for i in range(31,-1,-1):
if dividend>>i >=divisor:
c+=1<<i
dividend-=divisor<<i
c=c if flag>0 else -c
return min(c,2**31-1)#可能的结果[INT_MIN, -INT_MIN]但是要求是[INT_MIN, MIN_MAX]
- c++
class Solution {
public:
int divide(int dividend, int divisor) {
// 利用异或判断符号
int flag= (dividend>0)^(divisor>0)?-1:1;
long beichu=labs(dividend),chu=labs(divisor), c=0;
for (int i=31; i>=0; i--)
if ((beichu>>i)>=chu)
{
c+=((long)1)<<i;//防止2147483648得不到,因为在int中2^31是INT_MAX,得到INT_MAX+1的数
beichu-=chu<<i;
}
c=flag>0?c:-c;
return c>INT_MAX?INT_MAX:c;//可能的结果[INT_MIN, -INT_MIN]但是要求是[INT_MIN, MIN_MAX]
}
};