Деление с округлением вниз: // и divmod в Python

Деление с округлением вниз: // и divmod в Python

@python_quiz

Разберем этот квиз

Код из задания:

python

Коротко о сути: в Python оператор // и функция divmod используют целочисленное деление с округлением вниз (floor division). Это важно при работе с отрицательными числами.

Что вернёт программа и почему

Запустим пример:

python

Ожидаемый вывод:

Почему так:

  • Действительное частное -5 / 2 = -2.5. Округление вниз (в сторону -∞) даёт -3.
  • Для divmod возвращается кортеж (q, r) такой, что a = b * q + r.

Здесь q = -3, r = 1, потому что -3 * 2 + 1 = -5.

  • При положительном делителе остаток r всегда неотрицательный и 0 ≤ r < b.

Анализ вариантов (почему другие неверны)

  • "Вывод: -2 (-2, -1)"

- Это соответствует округлению к нулю (т.е. -2), а не к -∞. Кроме того, остаток -1 не укладывается в требование a = b*q + r с 0 ≤ r < 2.

  • "Вывод: -2 (-3, 1)"

- Вариант внутренне неконсистентен: для // указан -2, а для divmod — частное -3. Нельзя иметь разные частные в одном выражении.

  • "Вывод: -3 (-2, -1)"

- Частное в divmod указан как -2, но // показывает -3 — снова несоответствие; кроме того, остаток -1 при положительном делителе неверен по знаку.

Только вывод "-3 (-3, 1)" удовлетворяет правилам floor-division и тождеству a = b*q + r.

Небольшая демонстрация и дополнительные примеры

Покажем поведение на нескольких примерах:

python

Ожидаемый результат:

Замечания:

  • При отрицательном делителе остаток имеет тот же знак, что и делитель (т.е. остаток отрицательный).
  • Всегда выполняется a = b * q + r, и |r| < |b|.

Вывод

При целочисленном делении в Python используйте правило округления вниз. Для отрицательных чисел это означает, что частное может быть "меньше" (в математическом смысле) чем при округлении к нулю, а остаток будет иметь знак делителя (или 0). Это объясняет поведение выражения с a = -5 и b = 2: результат -3 и остаток 1.

Report Page