Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.
Return the quotient after dividing dividend by divisor.
The integer division should truncate toward zero.
Example 1:
Input: dividend = 10, divisor = 3
Output: 3
Example 2:
Input: dividend = 7, divisor = -3
Output: -2
Note:
给定两个整数除数和除数,除以两个整数而不使用乘法,除法和换算运算符。
将除数除以除数后返回商。
整数除法应截断为零。
注意:
对于这道题,要求计算两个数字的商。
在计算两个数字的商时,关键在于:
使得被除数减去除数、且不让被除数变为0的次数。
举个例子,假设被除数为15,除数为4,总的次数为m
因为m = 3,我们有:15 = 3*4 + 3
即,15/4 = 3
同时,需要注意的是,当INT_MIN除以-1时,会造成溢出,因此,当被除数和除数分别是上述二者时,直接返回INT_MAX即可。
static auto speedup = [](){
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
int divide(int dividend, int divisor) {
if(dividend == INT_MIN && divisor == -1)
return INT_MAX; //对移除的情况进行判断
int sign = dividend>0 ^ divisor>0 ? -1 : 1;
long long dvd = labs(dividend); //被除数
long long dvs = labs(divisor); //除数
long long res = 0;
//当被除数大于等于除数时
while(dvd >= dvs){
long tmp = dvs, m = 1;
while((tmp<<1) <= dvd){ //当前够除
tmp <<= 1; //除数×2
m <<= 1; //除数构成个数×2
}
dvd -= tmp; //剩余的被除数
res += m;
}
return sign*res;
}
};