Деление с округлением вниз: // и divmod в Python
@python_quizРазберем этот квиз
Код из задания:

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

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

Почему так:
- Действительное частное -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.
Небольшая демонстрация и дополнительные примеры
Покажем поведение на нескольких примерах:

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

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