Даны два целых числа dividend
(делимое) и divisor
(делитель).
Нужно разделить делимое на делитель без использования оператора умножения, деления и mod.
Целочисленное деление должно быть усечено до нуля, что означает потерю его дробной части. Например, 8.345
было бы усечено до 8
, а -2.7335
было бы усечено до -2
.
Верните частное после деления делимого на делитель.
Примечание: Предположим, мы имеем дело со средой, которая может хранить только целые числа в пределах 32-разрядного диапазона целых чисел со знаком: [-2^31, 2^31 − 1]. Для этой задачи, если частное строго больше 2^31 - 1, то верните 2^31 - 1, а если частное строго меньше -2^31, то верните -2^31.
Входные данные: dividend = 10, divisor = 3
Результат: 3
Пояснение: 10/3 = 3.33333, ответ усекается до 3.
Входные данные: dividend = 7, divisor = -3
Результат: -2
Пояснение: 7/-3 = -2.33333, ответ усекается до -2.
class Solution {
public:
int divide(int dividend, int divisor) {
if(dividend == INT_MIN && divisor == -1){
return INT_MAX;
} else if(divisor == 1) {
return dividend;
}
int sign = ((dividend < 0) != (divisor < 0)) ? -1 : 1;
long result = 0;
long a = abs(dividend);
long b = abs(divisor);
while(a >= b){
long long temp = b, mul = 1;
while(temp << 1 <= a){
temp <<= 1;
mul <<= 1;
}
a -= temp;
result += mul;
}
return sign * result;
}
};