Поведение оператора % с отрицательными числами в Python

Поведение оператора % с отрицательными числами в Python

@python_quiz

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

Коротко: у нас есть список чисел и мы берём поэлементно остаток от деления на 2, затем считаем, сколько раз встречаются 1 и -1.

Исходный код:

python

Вывод программы:

Пояснение (правило для % в Python)

В Python результат операции a % b имеет тот же знак, что и делитель b. Для положительного делителя остаток всегда неотрицателен и лежит в диапазоне [0, b-1]. Поскольку делитель здесь равен 2 (>0), все остатки будут либо 0, либо 1.

Поэлементно:

  • -3 % 2 == 1 (потому что -3 = (-2)*2 + 1)
  • -2 % 2 == 0
  • 0 % 2 == 0
  • 2 % 2 == 0
  • 3 % 2 == 1

Итого res = [1, 0, 0, 0, 1]. Соответственно:

  • res.count(1) == 2
  • res.count(-1) == 0

Анализ предложенных вариантов

  • "Вывод: 2 0" — совпадает с реальным выводом программы (см. расчёт выше).
  • "Вывод: 2 1" — неверно, в результате нет элементов равных -1, поэтому второй счётчик не может быть 1.
  • "Вывод: 3 0" — неверно, единиц ровно две, а не три.
  • "Исключение ZeroDivisionError" — невозможно в этом коде, делитель равен 2, деления на ноль нет.

Быстрые дополнения и сравнение с другими языками

  • В Python остаток при положительном делителе всегда неотрицателен. Но если делитель отрицателен, остаток будет иметь знак делителя:
python
  • В некоторых языках (например, C) знак остатка может следовать за знаком делимого, поэтому поведение на отрицательных числах отличается. Это важно учитывать при переносе логики между языками.

Альтернативный подсчёт (с использованием Counter)

Для наглядности можно использовать collections.Counter:

python

Вывод

Оператор % в Python возвращает остаток с тем же знаком, что и делитель. В данном примере остатки при делении на 2 дают лист [1, 0, 0, 0, 1], поэтому вывод программы — "2 0".

Report Page