← Назад к вопросам

Преобразование римского в число

2.2 Middle🔥 181 комментариев
#Теория тестирования

Условие

Напишите функцию, которая преобразует римское число в целое.

Пример

Вход: IV Выход: 4

Вход: LVIII Выход: 58

Вход: MCMXCIV Выход: 1994

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение: Преобразование римского числа в целое число

Римская система счисления использует буквы для обозначения чисел. Ключевой момент — правило вычитания: когда меньшее значение стоит перед большим, оно вычитается.

Таблица значений

БукваЗначение
I1
V5
X10
L50
C100
D500
M1000

Алгоритм решения

  1. Проходим по каждому символу римского числа слева направо
  2. Проверяем следующий символ (если есть)
  3. Если текущее значение < следующего — вычитаем из результата
  4. Иначе — прибавляем к результату
  5. Возвращаем результат

Реализация на 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

Решение универсально, обрабатывает все правила римской нумерации и работает корректно для всех валидных входных данных.