""" Sección Declarativa Descripción: Convierte un número decimal (1-3999) a romano utilizando una única función abstraída que aplica la misma regla lógica para unidades, decenas, centenas y millares. Casos de prueba: - 4 -> IV - 42 -> XLII - 999 -> CMXCIX - 2025 -> MMXXV - 3999 -> MMMCMXCIX Recursos: - numero (int): Entrada a convertir. - millares, centenas, decenas, unidades (int): Dígitos extraídos. - romano (str): Resultado acumulado. Funciones: - convertir_posicion(digito, uno, cinco, diez): Genera la cadena romana para un dígito (0-9) según los símbolos posicionales pasados como parámetros. """ # ========================================== # SECCIÓN DE DEFINICIÓN DE FUNCIONES # ========================================== def convertir_posicion(digito, base_1, base_5, base_10): """ Aplica las reglas de la numeración romana a un dígito genérico. Los parámetros base_1, base_5 y base_10 son los símbolos de esa magnitud. """ # Las condiciones se ordenan de menor o igual a mayor probabilidad de que se cumplan (eficiencia) if 0 < digito < 4: return digito * base_1 elif 5 < digito < 9: return base_5 + ((digito - 5) * base_1) elif digito == 4: return base_1 + base_5 elif digito == 5: return base_5 elif digito == 9: return base_1 + base_10 else: return "" # Para el caso en que el dígito sea 0 # ========================================== # SECCIÓN ALGORÍTMICA PRINCIPAL # ========================================== # 1) Prólogo print("--- Conversor a Números Romanos (Síntesis Funcional) ---") numero = int(input("\nIngrese un número entre 1 y 3999: ")) if numero < 1 or numero > 3999: print("Error: Número fuera de rango válido.") else: # 2) Desarrollo # Extracción de dígitos millares = numero // 1000 centenas = (numero % 1000) // 100 decenas = (numero % 100) // 10 unidades = numero % 10 # Construcción llamando a la misma función con diferentes "contextos" (símbolos) # Nota: Para millares, el 5 y el 10 no se usan (límite 3999), pasamos cadenas vacías. texto_millares = convertir_posicion(millares, "M", "", "") texto_centenas = convertir_posicion(centenas, "C", "D", "M") texto_decenas = convertir_posicion(decenas, "X", "L", "C") texto_unidades = convertir_posicion(unidades, "I", "V", "X") # Ensamblado por concatenación descendente (de izquierda a derecha) romano = texto_millares + texto_centenas + texto_decenas + texto_unidades # 3) Epílogo print(f"\nNúmero ingresado : {numero}") print(f"\nEn romano : {romano}") input("\nPulse Enter para terminar el programa")