Деление // и остаток % с отрицательными
Три способа поделить
| Операция | Пример | Результат |
|---|---|---|
| / — обычное деление | 7 / 2 | 3.5 (всегда float) |
| // — целочисленное | 7 // 2 | 3 |
| % — остаток | 7 % 2 | 1 |
Пока числа положительные, всё интуитивно. Отрицательные числа ломают привычку — и именно на этом теряют баллы.
Главное правило: // округляет вниз
// — это не «отбрасывание дробной части», а округление в меньшую сторону, к минус бесконечности:
| Выражение | Результат | Почему |
|---|---|---|
| 7 // 2 | 3 | 3.5 вниз → 3 |
| -7 // 2 | -4 | −3.5 вниз → −4, а не −3 |
| 7 // -2 | -4 | −3.5 вниз → −4 |
| -7 // -2 | 3 | 3.5 вниз → 3 |
В Паскале и C++ деление отрицательных работает иначе — там дробная часть просто отбрасывается и получается −3. Если решаешь задачу «как в учебнике», а проверяешь на Python, ответы разойдутся.
Остаток % берёт знак делителя
1 2
Полезное следствие: при положительном делителе остаток в Python никогда не бывает отрицательным. Поэтому проверка чётности работает для любых чисел:
1
Связь операций всегда одна: a == (a // b) * b + a % b. Проверим: (-7 // 2) * 2 + (-7 % 2) = -4 * 2 + 1 = -7.
Ловушка: int(a / b) — это не a // b
Самая частая ошибка — считать целую часть через обычное деление:
1 2
int() отбрасывает дробную часть, то есть округляет к нулю, а // — вниз. Для положительных чисел они совпадают, для отрицательных — нет.
Вторая беда int(a / b) — потеря точности на больших числах, а в заданиях 25 и 27 числа как раз большие:
1 2
Вывод простой: если нужно целое — пиши `//`, а не `int(a / b)`.
divmod — частное и остаток за один вызов
1 2
Удобно там, где нужны обе величины сразу — например, при разборе числа на цифры или переводе в другую систему счисления.
Пример с ЕГЭ: задание 5, работа с остатками
Формулировка: «На вход алгоритма подаётся натуральное число N. Алгоритм находит сумму цифр числа и приписывает её справа. Найдите наименьшее N > 9, при котором результат делится на 9».
Здесь % достаёт очередную цифру, а // укорачивает число:
1 2 3 4 5 6 7 8 9 10
Ответ — 18. Перебор идёт по возрастанию, поэтому первое подходящее N и есть наименьшее; break нужен, иначе выведется всё подряд.
Пример с ЕГЭ: задание 25, перебор делителей
Проверка делимости — это %, а сам делитель ищется через //:
1 2 3 4 5 6
