← Назад к вопросам
Преобразование римского в число
2.2 Middle🔥 181 комментариев
#Теория тестирования
Условие
Напишите функцию, которая преобразует римское число в целое.
Пример
Вход: IV Выход: 4
Вход: LVIII Выход: 58
Вход: MCMXCIV Выход: 1994
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение: Преобразование римского числа в целое число
Римская система счисления использует буквы для обозначения чисел. Ключевой момент — правило вычитания: когда меньшее значение стоит перед большим, оно вычитается.
Таблица значений
| Буква | Значение |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
Алгоритм решения
- Проходим по каждому символу римского числа слева направо
- Проверяем следующий символ (если есть)
- Если текущее значение < следующего — вычитаем из результата
- Иначе — прибавляем к результату
- Возвращаем результат
Реализация на Python
def roman_to_int(s: str) -> int:
# Словарь с соответствием букв значениям
roman_values = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}
result = 0
for i in range(len(s)):
# Получаем значение текущего символа
current_value = roman_values[s[i]]
# Если это не последний символ
if i + 1 < len(s):
next_value = roman_values[s[i + 1]]
# Если текущее значение меньше следующего — вычитаем
if current_value < next_value:
result -= current_value
else:
result += current_value
else:
# Последний символ всегда прибавляем
result += current_value
return result
# Примеры
print(roman_to_int('IV')) # 4
print(roman_to_int('LVIII')) # 58
print(roman_to_int('MCMXCIV')) # 1994
Пошаговый разбор примеров
Пример 1: IV
- I (1) < V (5) → вычитаем: result = -1
- V (5) — последний → прибавляем: result = -1 + 5 = 4 ✓
Пример 2: LVIII
- L (50) → прибавляем: result = 50
- V (5) < I (1)? Нет → прибавляем: result = 55
- I (1) < I (1)? Нет → прибавляем: result = 56
- I (1) → последний → прибавляем: result = 57
- I (1) → последний → прибавляем: result = 58 ✓
Пример 3: MCMXCIV
- M (1000) → прибавляем: result = 1000
- C (100) < M (1000) → вычитаем: result = 900
- M (1000) → прибавляем: result = 1900
- X (10) < C (100) → вычитаем: result = 1890
- C (100) → прибавляем: result = 1990
- I (1) < V (5) → вычитаем: result = 1989
- V (5) → последний → прибавляем: result = 1994 ✓
Сложность
- Временная сложность: O(n), где n — количество символов
- Пространственная сложность: O(1), словарь имеет фиксированный размер
Варианты реализации
# Компактный вариант
def roman_to_int_compact(s: str) -> int:
roman_values = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
result = 0
for i, char in enumerate(s):
value = roman_values[char]
if i + 1 < len(s) and value < roman_values[s[i + 1]]:
result -= value
else:
result += value
return result
Решение универсально, обрабатывает все правила римской нумерации и работает корректно для всех валидных входных данных.