Округление по российским правилам
Вы решили задачу. Теперь можно сравнить подходы.
При половине единицы округляем вверх; обычный round использует другое правило.
Авторский разбор для локальной версии на основе условия задачи. Это не выгрузка чужих посылок и не официальное решение исходного сайта.
Ваше принятое решение
Рекомендуемое решение: Явное правило округления 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 — суммарное число бит числителя, знаменателя и результата.
На что обратить внимание
- round(2.5) возвращает 2.
- int(float(x) + 0.5) может неверно округлить число очень близко к половине.
- Дано неотрицательное число; правило для отрицательных чисел здесь не требуется.
Рекомендация учитывает сложность и читаемость для этой задачи. Единственного самого быстрого решения для всех размеров входа и всех компьютеров может не быть.