Мини-урок · перед практикой

Округление по российским правилам

При половине единицы округляем вверх; обычный round использует другое правило.

Как к ней подойти

Увидите, как целочисленные операции и вычисления с дробями помогают обойтись без лишних шагов.

Коротко о теме

Операции // и % помогают разделить число на целую часть и остаток. Для дробных вычислений следите за точностью и порядком действий: одно и то же число может требовать разного способа обработки.

Ключевая идея · Явное правило округления Decimal

Конструктор сохраняет все цифры введённой записи. to_integral_value округляет непосредственно до целого по правилу половина вверх и, в отличие от quantize, не требует помещать все цифры результата в точность контекста.

Проверьте перед запуском

  • round(2.5) возвращает 2.
  • int(float(x) + 0.5) может неверно округлить число очень близко к половине.
  • Дано неотрицательное число; правило для отрицательных чисел здесь не требуется.

Сравните свой подход

Ниже - готовое решение, другой способ, если он есть, и важные детали проверки.

Ваше принятое решение

Рекомендуемое решение: Явное правило округления Decimal

Конструктор сохраняет все цифры введённой записи. to_integral_value округляет непосредственно до целого по правилу половина вверх и, в отличие от quantize, не требует помещать все цифры результата в точность контекста.

from decimal import Decimal, ROUND_HALF_UP
x = Decimal(input())
print(x.to_integral_value(rounding=ROUND_HALF_UP))

Время: O(L + E), включая вывод; E — длина результата. Память: O(L + E), входная запись и результат.

Другой способ: Точная дробь и сравнение остатка

После целочисленного деления остаток задаёт дробную часть. Если удвоенный остаток не меньше знаменателя, добавляем единицу. Вычисления точные, но работа с большими целыми дороже ограниченной вещественной арифметики.

from fractions import Fraction
x = Fraction(input())
whole, remainder = divmod(x.numerator, x.denominator)
print(whole + (2 * remainder >= x.denominator))

Время: Чтение O(L); стоимость деления и сокращения зависит от длины числителя и знаменателя. Память: O(B), B — суммарное число бит числителя, знаменателя и результата.