Programa Python para convertir enteros a romanos

Dado un número entero, la tarea es escribir un programa en Python para convertir números enteros a romanos.

Ejemplos:  

Input: 5
Output: V

Input: 9
Output: IX

Input: 40
Output: XL

Input:  1904
Output: MCMIV

La siguiente tabla muestra la lista de símbolos romanos, incluidos sus valores enteros correspondientes también:

simbolos Valores
yo 1
IV   4
V 5
IX 9
X 10
SG 40
L 50
XC 90
C 100
CD 400
D 500
CM 900
METRO 1000

La idea es convertir las unidades, decenas, centenas y miles de lugares del número dado por separado. Si el dígito es 0, entonces no hay ningún símbolo de número romano correspondiente. La conversión de los dígitos 4 y 9 es un poco diferente de otros dígitos porque estos dígitos siguen la notación sustractiva.  

Algoritmo para convertir un valor entero a número romano  

Compara el número dado con valores base en el orden 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1. El valor base que es menor o igual al número dado será el valor base inicial (valor base más grande), divida el número por su valor base más grande, el símbolo base correspondiente se repetirá cociente veces, el resto se convertirá en el número para futuras divisiones y repeticiones. El proceso se repetirá hasta que el número sea cero.

Método 1:

  • Número inicial = 3549, Desde 3549 >= 1000 ; el valor base más grande será 1000 inicialmente. Y Divide 3549/1000. Cociente = 3, Resto =549. El símbolo M correspondiente se repetirá tres veces.
  • Ahora, el número se convierte en 549 y 1000> 549> = 500, el valor base más grande será 500 y luego se dividirá 549/500. Cociente = 1, Resto =49. El símbolo D correspondiente se repetirá una vez.
  • Ahora, número = 49 y 50 > 49 >= 40, el valor base más grande es 40. Luego divide 49/40. Cociente = 1, Resto = 9. El símbolo XL correspondiente se repetirá una vez.
  • Ahora, número = 9 y 10 > 9 >= 9, el valor base más grande es 9. Luego divide 9/9. Cociente = 1, Resto = 0. El símbolo IX correspondiente se repetirá una vez.
  • Finalmente, el número se convierte en 0, el algoritmo se detiene aquí. La salida obtenida MMMDXLIX.

El siguiente ejemplo muestra la implementación del algoritmo anterior: 

Python3

# Python3 program to convert
# integer value to roman values
  
# Function to convert integer to Roman values
def printRoman(number):
    num = [1, 4, 5, 9, 10, 40, 50, 90,
        100, 400, 500, 900, 1000]
    sym = ["I", "IV", "V", "IX", "X", "XL",
        "L", "XC", "C", "CD", "D", "CM", "M"]
    i = 12
      
    while number:
        div = number // num[i]
        number %= num[i]
  
        while div:
            print(sym[i], end = "")
            div -= 1
        i -= 1
  
# Driver code
if __name__ == "__main__":
    number = 3549
    print("Roman value is:", end = " ")
    printRoman(number)

Producción:

Roman value is: MMMDXLIX

Método 2:

En este método, primero tenemos que observar el problema. El número dado en el enunciado del problema puede tener un máximo de 4 dígitos. La idea para resolver este problema es:  

  • Divide el número dado en dígitos en diferentes lugares como uno, dos, cien o mil.
  • A partir del lugar de las mil imprima el valor romano correspondiente. Por ejemplo, si el dígito en el lugar de mil es 3, imprima el equivalente romano de 3000.
  • Repetir el segundo paso hasta llegar al lugar de uno.

Supongamos que el número de entrada es 3549. Entonces, comenzando desde el lugar de mil, comenzaremos a imprimir el equivalente romano. En este caso, imprimiremos en el orden que se indica a continuación:  

  • El equivalente romano de 3000
  • El equivalente romano de 500
  • El equivalente romano de 40
  • El equivalente romano de 9

Entonces, la salida será: MMMDXLIX

El siguiente ejemplo muestra la implementación del enfoque anterior:

Python3

# Python3 program for above approach
  
# Function to calculate Roman values
def intToRoman(num):
  
    # Storing roman values of digits from 0-9
    # when placed at different places
    m = ["", "M", "MM", "MMM"]
    c = ["", "C", "CC", "CCC", "CD", "D",
         "DC", "DCC", "DCCC", "CM "]
    x = ["", "X", "XX", "XXX", "XL", "L",
         "LX", "LXX", "LXXX", "XC"]
    i = ["", "I", "II", "III", "IV", "V",
         "VI", "VII", "VIII", "IX"]
  
    # Converting to roman
    thousands = m[num // 1000]
    hundreds = c[(num % 1000) // 100]
    tens = x[(num % 100) // 10]
    ones = i[num % 10]
  
    ans = (thousands + hundreds +
           tens + ones)
  
    return ans
  
# Driver code
if __name__ == "__main__":
    number = 3549
    print(intToRoman(number))

Producción:

MMMDXLIX

Método 3:  

En este enfoque, consideramos el dígito significativo principal en el número. Ej: en 1234, el dígito significativo principal es 1. De manera similar, en 345 es 3. Para extraer el dígito significativo principal, necesitamos mantener un divisor (llamémoslo div) como 1000 para 1234 (ya que 1234 / 1000 = 1) y 100 por 345 (345 / 100 = 3). Además, mantengamos un diccionario llamado número romano = {1: ‘I’, 5: ‘V’, 10: ‘X’, 50: ‘L’, 100: ‘C’, 500: ‘D’, 1000: ‘ METRO’}

El siguiente ejemplo muestra la implementación del algoritmo anterior:

Python3

# Python 3 program to convert integer
# number to Roman values
import math
  
def integerToRoman(A):
    romansDict = \
        {
            1: "I",
            5: "V",
            10: "X",
            50: "L",
            100: "C",
            500: "D",
            1000: "M",
            5000: "G",
            10000: "H"
        }
  
    div = 1
    while A >= div:
        div *= 10
  
    div /= 10
  
    res = ""
  
    while A:
  
        # main significant digit extracted
        # into lastNum
        lastNum = int(A / div)
  
        if lastNum <= 3:
            res += (romansDict[div] * lastNum)
        elif lastNum == 4:
            res += (romansDict[div] +
                        romansDict[div * 5])
        elif 5 <= lastNum <= 8:
            res += (romansDict[div * 5] +
            (romansDict[div] * (lastNum - 5)))
        elif lastNum == 9:
            res += (romansDict[div] +
                        romansDict[div * 10])
  
        A = math.floor(A % div)
        div /= 10
          
    return res
  
# Driver code
print("Roman value for the integer is:"
                + str(integerToRoman(3549)))

Producción:

Roman value for the integer is: MMMDXLIX

Publicación traducida automáticamente

Artículo escrito por Kanchan_Ray y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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