Python Programming

Эффективное преобразование целых чисел в римские цифры в Python

Spread the love

В этой статье рассматриваются два метода Python для преобразования целых чисел в римские цифры. Мы изучим простой итеративный подход и более эффективный метод, использующий целочисленное деление.

Содержание

  1. Итеративный подход к преобразованию целых чисел в римские
  2. Эффективное преобразование с использованием целочисленного деления

Итеративный подход к преобразованию целых чисел в римские

Этот метод использует словарь, сопоставляющий римские цифры их целочисленным значениям, и итерируется по нему для построения римского представления числа. Вычитательная нотация (например, IV для 4) обрабатывается явно.


def int_to_roman_iterative(num):
    """Преобразует целое число в его римское представление с использованием итерации.

    Args:
        num: Целое число для преобразования (должно быть от 1 до 3999 включительно).

    Returns:
        Римское представление целого числа или None, если входные данные неверны.
    """
    if not 1 <= num = value:
            result += symbol
            num -= value
    return result

# Пример использования
print(int_to_roman_iterative(3))   # Вывод: III
print(int_to_roman_iterative(4))   # Вывод: IV
print(int_to_roman_iterative(9))   # Вывод: IX
print(int_to_roman_iterative(58))  # Вывод: LVIII
print(int_to_roman_iterative(1994)) # Вывод: MCMXCIV
print(int_to_roman_iterative(4000)) # Вывод: None

Этот подход прост для понимания, но может быть менее эффективен для больших чисел из-за повторяющихся вычитаний внутри цикла while.

Эффективное преобразование с использованием целочисленного деления

Этот метод использует целочисленное деление и оператор остатка для эффективной обработки больших целых чисел. Он итерируется по сопоставлению римских цифр только один раз.


def int_to_roman_division(num):
    """Преобразует целое число в его римское представление с использованием деления.

    Args:
        num: Целое число для преобразования (должно быть от 1 до 3999 включительно).

    Returns:
        Римское представление целого числа или None, если входные данные неверны.
    """
    if not 1 <= num <= 3999:
        return None

    roman_map = { 1000: 'M', 900: 'CM', 500: 'D', 400: 'CD', 100: 'C', 90: 'XC',
                  50: 'L', 40: 'XL', 10: 'X', 9: 'IX', 5: 'V', 4: 'IV', 1: 'I'}

    result = ""
    for value, symbol in roman_map.items():
        result += symbol * (num // value)
        num %= value
    return result

# Пример использования
print(int_to_roman_division(3))   # Вывод: III
print(int_to_roman_division(4))   # Вывод: IV
print(int_to_roman_division(9))   # Вывод: IX
print(int_to_roman_division(58))  # Вывод: LVIII
print(int_to_roman_division(1994)) # Вывод: MCMXCIV
print(int_to_roman_division(4000)) # Вывод: None

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *