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
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.