Написано: 06.03.2023

29. Разделить два целых (Divide Two Integers)

medium

Задание.

Даны два целых числа 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.

Пример 1.

Входные данные: dividend = 10, divisor = 3

Результат: 3

Пояснение: 10/3 = 3.33333, ответ усекается до 3.

Пример 2.

Входные данные: 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;
    }
};