今天继续刷LeetCode,第29题,两个整数相除。
分析:
既然题目要求不能使用乘法、除法、以及求余、求模,那么可以使用两个数进行相减。通过不断的相减,判断结果与被减数之间的大小,直到结果小于被减数,统计相减的次数,就是两个整数相除的结果。
问题:
1、整数溢出的情况;
2、正负号的判断;
3、循环相减时,如果缩短计算时间问题,可以采用次方,来缩短计算时间。
附上C++代码:
class Solution {
public:
int divide(int dividend, int divisor) {
if(dividend==INT_MIN&&divisor==-1)
return INT_MAX;
if(dividend==INT_MIN&&divisor==1)
return INT_MIN;
int flag=1;
if((long long)dividend*(long long)divisor<0)
flag=-1;
int re=0;
long long m=abs((long long)dividend);
long long n=abs((long long)divisor);
while(m>=n)
{
long long p=1,t=n;
while(m>(t<<1))
{
t<<=1;
p<<=1;
}
re+=p;
m-=t;
}
return re*flag;
}
};
附上精简的代码:
class Solution {
public:
int divide(int dividend, int divisor) {
if (dividend == INT_MIN && divisor == -1) {
return INT_MAX;
}
long dvd = labs(dividend), dvs = labs(divisor), ans = 0;
int sign = dividend > 0 ^ divisor > 0 ? -1 : 1;
while (dvd >= dvs) {
long temp = dvs, m = 1;
while (temp << 1 <= dvd) {
temp <<= 1;
m <<= 1;
}
dvd -= temp;
ans += m;
}
return sign * ans;
}
};
附上Python代码:
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
if dividend==-2**31 and divisor==-1:
return -dividend-1
flag = -1 if (dividend <0 and divisor >0) or (dividend>0 and divisor<0) else 1
m=abs(dividend)
n=abs(divisor)
re=0
while m>=n:
p=1
t=n
while m>=(t<<1):
t<<=1
p<<=1
m-=t
re+=p
return re*flag