Округление по российским правилам
При половине единицы округляем вверх; обычный round использует другое правило.
Как к ней подойти
Увидите, как целочисленные операции и вычисления с дробями помогают обойтись без лишних шагов.
Операции // и % помогают разделить число на целую часть и остаток. Для дробных вычислений следите за точностью и порядком действий: одно и то же число может требовать разного способа обработки.
Конструктор сохраняет все цифры введённой записи. 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 — суммарное число бит числителя, знаменателя и результата.