Este artículo explora dos métodos de Python para convertir enteros a números romanos. Examinaremos un enfoque iterativo sencillo y un método más eficiente que utiliza la división entera.
Tabla de contenido
Enfoque iterativo para la conversión entero-romano
Este método utiliza un diccionario que mapea los números romanos a sus valores enteros e itera a través de él para construir la representación del número romano. La notación sustractiva (como IV para 4) se maneja explícitamente.
def int_to_roman_iterative(num):
"""Convierte un entero a su representación en números romanos usando iteración.
Args:
num: El entero a convertir (debe estar entre 1 y 3999 inclusive).
Returns:
La representación en números romanos del entero, o None si la entrada no es válida.
"""
if not 1 <= num = value:
result += symbol
num -= value
return result
# Ejemplo de uso
print(int_to_roman_iterative(3)) # Salida: III
print(int_to_roman_iterative(4)) # Salida: IV
print(int_to_roman_iterative(9)) # Salida: IX
print(int_to_roman_iterative(58)) # Salida: LVIII
print(int_to_roman_iterative(1994)) # Salida: MCMXCIV
print(int_to_roman_iterative(4000)) # Salida: None
Este enfoque es fácil de entender, pero puede ser menos eficiente para números más grandes debido a las restas repetidas dentro del bucle while
.
Conversión eficiente usando división entera
Este método utiliza la división entera y el operador módulo para manejar eficientemente enteros más grandes. Itera a través del mapeo de números romanos solo una vez.
def int_to_roman_division(num):
"""Convierte un entero a su representación en números romanos usando división.
Args:
num: El entero a convertir (debe estar entre 1 y 3999 inclusive).
Returns:
La representación en números romanos del entero, o None si la entrada no es vá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
# Ejemplo de uso
print(int_to_roman_division(3)) # Salida: III
print(int_to_roman_division(4)) # Salida: IV
print(int_to_roman_division(9)) # Salida: IX
print(int_to_roman_division(58)) # Salida: LVIII
print(int_to_roman_division(1994)) # Salida: MCMXCIV
print(int_to_roman_division(4000)) # Salida: None
Este enfoque basado en la división ofrece un mejor rendimiento, particularmente para números de entrada más grandes, al minimizar las operaciones redundantes.