Первая цифра после точки
Извлекаем цифру десятых из точного десятичного представления.
Как к ней подойти
Увидите, как целочисленные операции и вычисления с дробями помогают обойтись без лишних шагов.
Операции // и % помогают разделить число на целую часть и остаток. Для дробных вычислений следите за точностью и порядком действий: одно и то же число может требовать разного способа обработки.
Decimal точно читает десятичную запись без арифметического округления. В as_tuple цифры хранятся отдельно от показателя степени десяти. После сдвига десятичной точки цифра десятых имеет индекс len(digits) + exponent; за пределами значащих цифр стоит ноль. Поддерживается и экспоненциальная запись.
Проверьте перед запуском
- Вещественное умножение или Decimal с ограниченной точностью могут округлить число перед выделением цифры.
- Если дробной части нет, ответ 0.
Сравните свой подход
Ниже - готовое решение, другой способ, если он есть, и важные детали проверки.
Ваше принятое решение
Рекомендуемое решение: Цифра в точной десятичной записи
Decimal точно читает десятичную запись без арифметического округления. В as_tuple цифры хранятся отдельно от показателя степени десяти. После сдвига десятичной точки цифра десятых имеет индекс len(digits) + exponent; за пределами значащих цифр стоит ноль. Поддерживается и экспоненциальная запись.
from decimal import Decimal
parts = Decimal(input()).as_tuple()
index = len(parts.digits) + parts.exponent
print(parts.digits[index] if 0 <= index < len(parts.digits) else 0)
Время: O(L), L — длина входной записи. Память: O(L) для цифр и входа.
Другой способ: Развёрнутая запись числа
Разворачиваем экспоненциальную запись в обычную, затем берём первую цифру дробной части. Этот вариант проще читать, но очень большой показатель степени может создать длинную строку.
from decimal import Decimal
s = format(Decimal(input()), 'f')
fraction = s.partition('.')[2]
print(fraction[0] if fraction else '0')
Время: O(L + E), E — длина развёрнутой записи. Память: O(L + E).