Convertir números romanos a enteros en Python

Shikha Chaudhary 10 octubre 2023
  1. Convertir números romanos a enteros en Python
  2. Programa de Python para convertir números romanos a enteros en Python
  3. Utilice los diccionarios de Python para convertir números romanos en números enteros en Python
  4. Utilice el módulo romano de Python para convertir números romanos en números enteros en Python
  5. Conclusión
Convertir números romanos a enteros en Python

De niños, todos hemos aprendido a convertir números romanos en números enteros. Ahora, cuando seamos programadores, hagamos un programa en Python que haga esto por nosotros.

En este artículo, aprenderemos cómo convertir números romanos a números enteros usando Python.

Convertir números romanos a enteros en Python

Antes de saltar al código real, revisemos las reglas para convertir números romanos en números enteros. Estos son los símbolos básicos utilizados para ciertos números enteros:

Integer      Roman Numeral
   1               I
   5               V
   10              X
   50              L
   100             C
   500             D
   1000            M

Sabemos que podemos encontrar el valor correspondiente de un número entero a partir de una cadena dada de números romanos. Pero tenemos que seguir algunas reglas cuando lo hacemos.

  1. Para una cadena dada de números romanos, al moverse de izquierda a derecha, si los valores de los símbolos disminuyen o permanecen iguales, sumamos sus equivalentes enteros para obtener la respuesta final como un número entero.

    XVII
    
    X - 10
    V - 5
    I - 1
    I - 1
    
    10 + 5 + 1 + 1 = 17
    

    En el ejemplo anterior, los valores disminuyen de izquierda a derecha. Entonces, los sumamos todos y obtenemos 17 como valor entero.

  2. Para una cadena dada de números romanos, al moverse de izquierda a derecha, si los valores de los símbolos aumentan, restamos los equivalentes enteros del valor más pequeño del más grande para obtener la respuesta final como un número entero.

    XL
    
    X - 10
    L - 50
    
    50 - 10 = 40
    

    En el ejemplo anterior, los valores aumentan de izquierda a derecha. Entonces, los restamos para obtener 40 como el valor entero.

Debe recordar estas dos reglas al escribir el código para convertir un número romano en un número entero. Además, tenga en cuenta que, además de los diccionarios, podemos usar algunas formas más de convertir un número romano en un número entero.

Veámoslos uno por uno.

Programa de Python para convertir números romanos a enteros en Python

El enfoque más simple para convertir un número romano en un número entero es usar la instrucción if para almacenar los símbolos romanos básicos. Aquí está el código para el mismo.

# function to store the basic roman symbols
def map_symbols(s):
    if s == "I":
        return 1
    if s == "V":
        return 5
    if s == "X":
        return 10
    if s == "L":
        return 50
    if s == "C":
        return 100
    if s == "D":
        return 500
    if s == "M":
        return 1000
    return -1


# function to perform the conversion
def change_roman_to_int(roman):
    ans = 0
    i = 0

    while i < len(roman):
        x1 = map_symbols(roman[i])

        if i + 1 < len(roman):
            x2 = map_symbols(roman[i + 1])

            if x1 >= x2:
                ans = ans + x1
                i = i + 1
            else:
                ans = ans + x2 - x1
                i = i + 2

        else:
            ans = ans + x1
            i = i + 1

    return ans


# driver code
r = input("Enter the roman numeral: ")
print("The integer equivalent is: ")
print(change_roman_to_int(r))

Producción :

Enter the roman numeral: MLXVI
The integer equivalent is:
1066

Veamos el funcionamiento de este código.

Cuando ingresamos una cadena romana como entrada, se almacena en la variable r, que luego se pasa a la función cambiar_romana_a_int. Usamos un bucle while dentro de esta función para iterar sobre toda la cadena.

Además, a medida que el bucle while recorre cada valor, las declaraciones if-else dentro del bucle while hacen lo siguiente:

  1. Si el valor del símbolo actual es mayor o igual que el valor del siguiente símbolo, entonces el valor actual se suma a la variable ans.
  2. En caso contrario, a la variable ans se le suma el valor del siguiente símbolo y luego se le resta el valor actual.

Así es esencialmente cómo funciona este código.

Veamos ahora otro método en el que usamos diccionarios de Python para convertir números romanos en números enteros.

Utilice los diccionarios de Python para convertir números romanos en números enteros en Python

Aquí, la idea básica sigue siendo la misma. Lo único que cambia es que usamos un diccionario para almacenar los números romanos y sus valores enteros correspondientes en lugar de la declaración if.

Aquí está el código para el mismo.

# function to convert roman numeral into an integer
def change_roman_to_int(roman):

    # dictionary to store the roman-integer values
    map_symbols = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}

    ans = 0
    for i in range(len(roman)):
        if i > 0 and map_symbols[roman[i]] > map_symbols[roman[i - 1]]:
            ans += map_symbols[roman[i]] - 2 * map_symbols[roman[i - 1]]
        else:
            ans += map_symbols[roman[i]]
    return ans


# driver code
r = input("Enter the roman numeral: ")
print("The integer equivalent is: ")
print(change_roman_to_int(r))

Producción :

Enter the roman numeral: MMMCMLXX
The integer equivalent is:
3970

Tenga en cuenta que puede usar el bucle for o el bucle while para iterar sobre la cadena de entrada, ya que ambos funcionarán de manera similar.

También puede usar la función enumerar con un diccionario, como en el código a continuación.

# function to convert roman numeral into an integer
def change_roman_to_int(roman):

    # dictionary to store the roman-integer values
    map_symbols = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}

    ans = 0
    l = len(roman)
    for (i, v) in enumerate(roman):
        if i < l - 1 and map_symbols[v] < map_symbols[roman[i + 1]]:
            ans -= map_symbols[v]
        else:
            ans += map_symbols[v]

    return ans


# driver code
r = input("Enter the roman numeral: ")
print("The integer equivalent is: ")
print(change_roman_to_int(r))

Producción :

Enter the roman numeral: MCMXCIV
The integer equivalent is:
1994

Hemos estado agregando solo los 7 símbolos romanos básicos en el diccionario. Podemos simplificar el código aún más si agregamos más símbolos personalizados.

Mira el código que se muestra a continuación.

# function to change a roman numeral into an integer
def change_roman_to_int(roman):
    custom_symbols = {"IV": -2, "IX": -2, "XL": -20, "XC": -20, "CD": -200, "CM": -200}
    map_symbols = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}
    ans = 0

    for i in roman:
        ans += map_symbols[i]

    for i in range(len(roman) - 1):
        merge = str(roman[i] + roman[i + 1])
        if merge in custom_symbols:
            ans += custom_symbols[merge]

    return ans


# driver code
r = input("Enter the roman numeral: ")
print("The integer equivalent is: ")
print(change_roman_to_int(r))

Producción :

Enter the roman numeral: MCMXCIV
The integer equivalent is:
1994

¿No te sorprende la inteligencia de este código? Veamos cómo funciona este código.

Dentro de la función change_roman_to_int tenemos dos diccionarios: el diccionario map_symbols con los 7 valores habituales y el diccionario custom_symbols con valores negativos correspondientes a un par de símbolos romanos.

Además, el primer bucle for suma los valores enteros de todos los símbolos romanos y almacena la suma en la variable ans. Así es como se ve este paso:

MCMXCIV
M = 1000, C = 100, M = 1000, X = 10, C = 100, I = 1, V = 5

1000 + 100 + 1000 + 10 + 100 + 1 + 5 = 2216
ans = 2216

Luego, el segundo bucle for itera sobre la cadena romana, tomando dos símbolos a la vez y almacenándolos como una cadena en la variable merge. La instrucción if dentro de este bucle for comprueba si el par fusionado está presente en el diccionario custom_symbols.

El valor negativo correspondiente se suma a la variable ans si se encuentra. Así es como se ve este paso:

MC - Not found

CM - Found
ans = 2216 + (-200)
ans = 2016

MX - Not found

XC - Found
ans = 2016 + (-20)
ans = 1996

CI - Not found

IV - Found
ans = 1996 + (-2)
ans = 1994

Así es esencialmente cómo funciona este código.

Hemos estado escribiendo todo este código durante mucho tiempo. Ahora, sentémonos y hagamos que Python haga el trabajo.

Utilice el módulo romano de Python para convertir números romanos en números enteros en Python

¿Cómo puede alguien usar Python y no saber que debe haber un módulo que tenga funciones para convertir un número romano en un número entero? Bueno, ese módulo se llama romano.

Para descargar este módulo, ejecute el siguiente comando en cmd.

pip install roman

Producción :

Downloading roman-3.3-py2.py3-none-any.whl (3.9 kB)
Installing collected packages: roman
Successfully installed roman-3.3

Debe ver el mensaje anterior una vez que el módulo esté instalado.

Ahora, podemos importar este módulo a nuestro código y usar la función fromRoman() para convertir cualquier número romano en un número entero.

import roman

x = roman.fromRoman("MCMXCIV")
print(x)

Producción :

1994

Consulte este enlace para obtener más información sobre el módulo romano de Python.

Conclusión

En este artículo, analizamos algunas formas muy interesantes de convertir un número romano en un número entero en Python. Usamos las declaraciones if de Python y los diccionarios de Python para lograr esto.

Además, vimos cómo podemos usar valores negativos para los pares romanos para que el código sea más fácil y más corto. Por último, vimos el uso del módulo roman de Python que utiliza la función fromRoman() para convertir un número romano en un número entero.

Artículo relacionado - Python Integer