Python Programming

Conversão Eficiente de Inteiro para Numeral Romano em Python

Spread the love

Este artigo explora dois métodos Python para converter inteiros em numerais romanos. Examinaremos uma abordagem iterativa simples e um método mais eficiente utilizando divisão inteira.

Sumário

  1. Abordagem Iterativa para Conversão Inteiro-Romano
  2. Conversão Eficiente Usando Divisão Inteira

Abordagem Iterativa para Conversão Inteiro-Romano

Este método usa um dicionário mapeando numerais romanos para seus valores inteiros e itera sobre ele para construir a representação em numeral romano. A notação subtractiva (como IV para 4) é tratada explicitamente.


def int_to_roman_iterative(num):
    """Converte um inteiro para sua representação em numeral romano usando iteração.

    Args:
        num: O inteiro a ser convertido (deve estar entre 1 e 3999 inclusive).

    Returns:
        A representação em numeral romano do inteiro, ou None se a entrada for inválida.
    """
    if not 1 <= num = value:
            result += symbol
            num -= value
    return result

# Exemplo de Uso
print(int_to_roman_iterative(3))   # Saída: III
print(int_to_roman_iterative(4))   # Saída: IV
print(int_to_roman_iterative(9))   # Saída: IX
print(int_to_roman_iterative(58))  # Saída: LVIII
print(int_to_roman_iterative(1994)) # Saída: MCMXCIV
print(int_to_roman_iterative(4000)) # Saída: None

Esta abordagem é fácil de entender, mas pode ser menos eficiente para números maiores devido às subtrações repetidas dentro do loop while.

Conversão Eficiente Usando Divisão Inteira

Este método usa divisão inteira e o operador módulo para lidar eficientemente com inteiros maiores. Ele itera sobre o mapeamento de numerais romanos apenas uma vez.


def int_to_roman_division(num):
    """Converte um inteiro para sua representação em numeral romano usando divisão.

    Args:
        num: O inteiro a ser convertido (deve estar entre 1 e 3999 inclusive).

    Returns:
        A representação em numeral romano do inteiro, ou None se a entrada for inválida.
    """
    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

# Exemplo de Uso
print(int_to_roman_division(3))   # Saída: III
print(int_to_roman_division(4))   # Saída: IV
print(int_to_roman_division(9))   # Saída: IX
print(int_to_roman_division(58))  # Saída: LVIII
print(int_to_roman_division(1994)) # Saída: MCMXCIV
print(int_to_roman_division(4000)) # Saída: None

Esta abordagem baseada em divisão oferece melhor desempenho, particularmente para números de entrada maiores, minimizando operações redundantes.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *