题意
计算两个数相除,要求不能使用除法
思路
不能使用除法,但是可以使用减法来实现,如果使用普通的减法会超时,所以可以采用倍增的方法,例如:
计算
dividenddivisor
利用
2n∗divisor
,通过对
n
进行倍增来寻找
需要注意的
- 取绝对值之后 int 溢出
- 当 divisor 为-1的时候的溢出情况
代码
class Solution {
public:
int divide(int dividend, int divisor) {
size_t flag = 1;
if(divisor == 0) return INT_MAX;
if(dividend == INT_MIN && divisor == 1) return INT_MIN;
if(dividend == INT_MIN && divisor == -1) return INT_MAX;
if(dividend < 0) flag = -1;
if(divisor < 0){
if(flag == -1) flag = 1;
else flag = -1;
}
long long up = abs((long long)dividend);
long long down = abs((long long)divisor);
long long cnt = 0;
while(up >= down)
{
long long num = 1;
while(up >= (num * down))
{
up -= num * down;
cnt += num;
num *= 2;
}
}
return cnt * flag;
}
};