Python Programming

Conversión eficiente de enteros a números romanos en Python

Spread the love

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

  1. Enfoque iterativo para la conversión entero-romano
  2. Conversión eficiente usando división entera

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *