Сложность: medium
Учитывая два целых числа: делимое и делитель, разделите два целых числа, не используя операторы умножения, деления и модификатора.
Целочисленное деление должно сокращаться до нуля, что означает потерю дробной части. Например, 8,345 будет сокращено до 8, а -2,7335 будет сокращено до -2.
Возвращает частное после деления делимого на делитель.
Примечание: Если частное строго больше
2^31 - 1, верните 2^31 - 1, а если строго меньше -2^31, верните -2^31. Пример:
Input: dividend = 10, divisor = 3
Output: 3
👨💻 Алгоритм:
1⃣Определяем знак результата, приводим числа к положительному виду и инициализируем счетчик.
2⃣Используем вычитание с накоплением для имитации деления без
/ и *. 3⃣Проверяем выход за пределы 32-битного диапазона и возвращаем результат.
😎Решение:
class Solution {
/**
* @param Integer $dividend
* @param Integer $divisor
* @return Integer
*/
function divide($dividend, $divisor) {
if ($dividend == -pow(2,31) && $divisor == -1) {
return pow(2,31)-1;
}
$sign = (($dividend < 0) ^ ($divisor < 0)) ? -1 : 1;
$dividend = abs($dividend);
$divisor = abs($divisor);
$quotient = 0;
while ($dividend >= $divisor) {
$temp = $divisor;
$multiple = 1;
while ($dividend >= ($temp << 1)) {
$temp <<= 1;
$multiple <<= 1;
}
$dividend -= $temp;
$quotient += $multiple;
}
return $sign * $quotient;
}
}Ставь 👍 и забирай 📚 Базу знаний