Conversión de números romanos a decimales entre 1 y 3999

Dado un número romano, la tarea es encontrar su valor decimal correspondiente.

Ejemplo : 

Input: IX
Output: 9
IX is a Roman symbol which represents 9 

Input: XL
Output: 40
XL is a Roman symbol which represents 40

Input: MCMIV
Output: 1904
M is a thousand, 
CM is nine hundred and 
IV is four

Los números romanos se basan en los siguientes símbolos.  

SYMBOL       VALUE
  I            1
  IV           4
  V            5
  IX           9
  X            10
  XL           40
  L            50
  XC           90
  C            100
  CD           400
  D            500
  CM           900 
  M            1000

Enfoque: Un número en números romanos es una string de estos símbolos escritos en orden descendente (por ejemplo, la M primero, seguida de la D, etc.). Sin embargo, en algunos casos específicos, para evitar que cuatro caracteres se repitan en sucesión (como IIII o XXXX), la notación sustractiva se usa a menudo de la siguiente manera: 

  • Coloqué antes de V o X indica uno menos, entonces cuatro es IV (uno menos que 5) y 9 es IX (uno menos que 10).
  • X colocado antes de L o C indica diez menos, por lo que cuarenta es XL (10 menos que 50) y 90 es XC (diez menos que cien).
  • C colocada antes de D o M indica cien menos, por lo que cuatrocientos es CD (cien menos que quinientos) y novecientos es CM (cien menos que mil).

Algoritmo para convertir números romanos a números enteros:  

  1. Divida la string de números romanos en símbolos romanos (carácter).
  2. Convierta cada símbolo de números romanos en el valor que representa.
  3. Tome el símbolo uno por uno desde el índice 0: 
    1. Si el valor actual del símbolo es mayor o igual que el valor del siguiente símbolo, agregue este valor al total acumulado.
    2. de lo contrario, reste este valor sumando el valor del siguiente símbolo al total acumulado.

A continuación se muestra la implementación del algoritmo anterior: 

C++

// Program to convert Roman
// Numerals to Numbers
#include <bits/stdc++.h>
using namespace std;
 
// This function returns value
// of a Roman symbol
int value(char r)
{
    if (r == 'I')
        return 1;
    if (r == 'V')
        return 5;
    if (r == 'X')
        return 10;
    if (r == 'L')
        return 50;
    if (r == 'C')
        return 100;
    if (r == 'D')
        return 500;
    if (r == 'M')
        return 1000;
 
    return -1;
}
 
// Returns decimal value of
// roman numaral
int romanToDecimal(string& str)
{
    // Initialize result
    int res = 0;
 
    // Traverse given input
    for (int i = 0; i < str.length(); i++) {
        // Getting value of symbol s[i]
        int s1 = value(str[i]);
 
        if (i + 1 < str.length()) {
            // Getting value of symbol s[i+1]
            int s2 = value(str[i + 1]);
 
            // Comparing both values
            if (s1 >= s2) {
                // Value of current symbol
                // is greater or equal to
                // the next symbol
                res = res + s1;
            }
            else {
                // Value of current symbol is
                // less than the next symbol
                res = res + s2 - s1;
                i++;
            }
        }
        else {
            res = res + s1;
        }
    }
    return res;
}
 
// Driver Code
int main()
{
    // Considering inputs given are valid
    string str = "MCMIV";
    cout << "Integer form of Roman Numeral is "
         << romanToDecimal(str) << endl;
 
    return 0;
}

C

// Program to convert Roman
// Numerals to Numbers
#include <stdio.h>
#include <string.h>
 
// This function returns value
// of a Roman symbol
int value(char r)
{
    if (r == 'I')
        return 1;
    if (r == 'V')
        return 5;
    if (r == 'X')
        return 10;
    if (r == 'L')
        return 50;
    if (r == 'C')
        return 100;
    if (r == 'D')
        return 500;
    if (r == 'M')
        return 1000;
 
    return -1;
}
 
// Returns decimal value of
// roman numaral
int romanToDecimal(char str[])
{
    // Initialize result
    int res = 0;
 
    // Traverse given input
    for (int i = 0; i < strlen(str); i++)
    {
        // Getting value of symbol s[i]
        int s1 = value(str[i]);
 
        if (i + 1 < strlen(str))
        {
            // Getting value of symbol s[i+1]
            int s2 = value(str[i + 1]);
 
            // Comparing both values
            if (s1 >= s2)
            {
                // Value of current symbol
                // is greater or equal to
                // the next symbol
                res = res + s1;
            }
            else
            {
                // Value of current symbol is
                // less than the next symbol
                res = res + s2 - s1;
                i++;
            }
        }
        else {
            res = res + s1;
        }
    }
    return res;
}
 
// Driver Code
int main()
{
    // Considering inputs given are valid
    char str[10] = "MCMIV";
    printf("Integer form of Roman Numeral is %d",romanToDecimal(str));
 
 
    return 0;
}

Java

// Program to convert Roman
// Numerals to Numbers
import java.util.*;
 
public class RomanToNumber {
    // This function returns
    // value of a Roman symbol
    int value(char r)
    {
        if (r == 'I')
            return 1;
        if (r == 'V')
            return 5;
        if (r == 'X')
            return 10;
        if (r == 'L')
            return 50;
        if (r == 'C')
            return 100;
        if (r == 'D')
            return 500;
        if (r == 'M')
            return 1000;
        return -1;
    }
 
    // Finds decimal value of a
    // given roman numeral
    int romanToDecimal(String str)
    {
        // Initialize result
        int res = 0;
 
        for (int i = 0; i < str.length(); i++) {
            // Getting value of symbol s[i]
            int s1 = value(str.charAt(i));
 
            // Getting value of symbol s[i+1]
            if (i + 1 < str.length()) {
                int s2 = value(str.charAt(i + 1));
 
                // Comparing both values
                if (s1 >= s2) {
                    // Value of current symbol
                    // is greater or equalto
                    // the next symbol
                    res = res + s1;
                }
                else {
                    // Value of current symbol is
                    // less than the next symbol
                    res = res + s2 - s1;
                    i++;
                }
            }
            else {
                res = res + s1;
            }
        }
 
        return res;
    }
 
    // Driver Code
    public static void main(String args[])
    {
        RomanToNumber ob = new RomanToNumber();
 
        // Considering inputs given are valid
        String str = "MCMIV";
        System.out.println("Integer form of Roman Numeral"
                           + " is "
                           + ob.romanToDecimal(str));
    }
}

Python

# Python program to convert Roman Numerals
# to Numbers
 
# This function returns value of each Roman symbol
 
 
def value(r):
    if (r == 'I'):
        return 1
    if (r == 'V'):
        return 5
    if (r == 'X'):
        return 10
    if (r == 'L'):
        return 50
    if (r == 'C'):
        return 100
    if (r == 'D'):
        return 500
    if (r == 'M'):
        return 1000
    return -1
 
 
def romanToDecimal(str):
    res = 0
    i = 0
 
    while (i < len(str)):
 
        # Getting value of symbol s[i]
        s1 = value(str[i])
 
        if (i + 1 < len(str)):
 
            # Getting value of symbol s[i + 1]
            s2 = value(str[i + 1])
 
            # Comparing both values
            if (s1 >= s2):
 
                # Value of current symbol is greater
                # or equal to the next symbol
                res = res + s1
                i = i + 1
            else:
 
                # Value of current symbol is greater
                # or equal to the next symbol
                res = res + s2 - s1
                i = i + 2
        else:
            res = res + s1
            i = i + 1
 
    return res
 
 
# Driver code
print("Integer form of Roman Numeral is"),
print(romanToDecimal("MCMIV"))

C#

// C# Program to convert Roman
// Numerals to Numbers
using System;
 
class GFG {
    // This function returns value
    // of a Roman symbol
    public virtual int value(char r)
    {
        if (r == 'I')
            return 1;
        if (r == 'V')
            return 5;
        if (r == 'X')
            return 10;
        if (r == 'L')
            return 50;
        if (r == 'C')
            return 100;
        if (r == 'D')
            return 500;
        if (r == 'M')
            return 1000;
        return -1;
    }
 
    // Finds decimal value of a
    // given roman numeral
    public virtual int romanToDecimal(string str)
    {
        // Initialize result
        int res = 0;
 
        for (int i = 0; i < str.Length; i++) {
            // Getting value of symbol s[i]
            int s1 = value(str[i]);
 
            // Getting value of symbol s[i+1]
            if (i + 1 < str.Length) {
                int s2 = value(str[i + 1]);
 
                // Comparing both values
                if (s1 >= s2) {
                    // Value of current symbol is greater
                    // or equalto the next symbol
                    res = res + s1;
                }
                else {
                    res = res + s2 - s1;
                    i++; // Value of current symbol is
                    // less than the next symbol
                }
            }
            else {
                res = res + s1;
                i++;
            }
        }
 
        return res;
    }
 
    // Driver Code
    public static void Main(string[] args)
    {
        GFG ob = new GFG();
 
        // Considering inputs given are valid
        string str = "MCMIV";
        Console.WriteLine("Integer form of Roman Numeral"
                          + " is "
                          + ob.romanToDecimal(str));
    }
}
 
// This code is contributed by Shrikant13

PHP

<?php
// Program to convert Roman
// Numerals to Numbers
 
// This function returns
// value of a Roman symbol
function value($r)
{
    if ($r == 'I')
        return 1;
    if ($r == 'V')
        return 5;
    if ($r == 'X')
        return 10;
    if ($r == 'L')
        return 50;
    if ($r == 'C')
        return 100;
    if ($r == 'D')
        return 500;
    if ($r == 'M')
        return 1000;
 
    return -1;
}
 
// Returns decimal value
// of roman numeral
function romanToDecimal(&$str)
{
    // Initialize result
    $res = 0;
 
    // Traverse given input
    for ($i = 0; $i < strlen($str); $i++)
    {
        // Getting value of
        // symbol s[i]
        $s1 = value($str[$i]);
 
        if ($i+1 < strlen($str))
        {
            // Getting value of
            // symbol s[i+1]
            $s2 = value($str[$i + 1]);
 
            // Comparing both values
            if ($s1 >= $s2)
            {
                // Value of current symbol
                // is greater or equal to
                // the next symbol
                $res = $res + $s1;
            }
            else
            {
                $res = $res + $s2 - $s1;
                $i++; // Value of current symbol is
                      // less than the next symbol
            }
        }
        else
        {
            $res = $res + $s1;
            $i++;
        }
    }
    return $res;
}
 
// Driver Code
 
// Considering inputs
// given are valid
$str ="MCMIV";
echo "Integer form of Roman Numeral is ",
              romanToDecimal($str), "\n";
 
// This code is contributed by ajit
?>

Javascript

<script>
// Program to convert Roman
// Numerals to Numberspublic
    // This function returns
    // value of a Roman symbol
    function value(r) {
        if (r == 'I')
            return 1;
        if (r == 'V')
            return 5;
        if (r == 'X')
            return 10;
        if (r == 'L')
            return 50;
        if (r == 'C')
            return 100;
        if (r == 'D')
            return 500;
        if (r == 'M')
            return 1000;
        return -1;
    }
 
    // Finds decimal value of a
    // given roman numeral
    function romanToDecimal( str)
    {
     
        // Initialize result
        var res = 0;
 
        for (i = 0; i < str.length; i++)
        {
         
            // Getting value of symbol s[i]
            var s1 = value(str.charAt(i));
 
            // Getting value of symbol s[i+1]
            if (i + 1 < str.length) {
                var s2 = value(str.charAt(i + 1));
 
                // Comparing both values
                if (s1 >= s2) {
                    // Value of current symbol
                    // is greater or equalto
                    // the next symbol
                    res = res + s1;
                }
                else
                {
                 
                    // Value of current symbol is
                    // less than the next symbol
                    res = res + s2 - s1;
                    i++;
                }
            } else {
                res = res + s1;
            }
        }
 
        return res;
    }
 
    // Driver Code
     
        // Considering inputs given are valid
        var str = "MCMIV";
        document.write("Integer form of Roman Numeral"
        + " is " + romanToDecimal(str));
 
// This code is contributed by umadevi9616
</script>
Producción

Integer form of Roman Numeral is 1904

Análisis de Complejidad: 

  • Complejidad de tiempo: O(n), donde n es la longitud de la string. 
    Solo se requiere un recorrido de la string.
  • Complejidad espacial: O(1). 
    Como no se requiere espacio adicional.

Otra solución –

C++

// Program to convert Roman
// Numerals to Numbers
#include <bits/stdc++.h>
using namespace std;
 
// This function returns value
// of a Roman symbol
int romanToDecimal(string& str)
{
    map<char, int> m;
    m.insert({ 'I', 1 });
    m.insert({ 'V', 5 });
    m.insert({ 'X', 10 });
    m.insert({ 'L', 50 });
    m.insert({ 'C', 100 });
    m.insert({ 'D', 500 });
    m.insert({ 'M', 1000 });
    int sum = 0;
    for (int i = 0; i < str.length(); i++)
    {
        /*If present value is less than next value,
          subtract present from next value and add the
          resultant to the sum variable.*/
        if (m[str[i]] < m[str[i + 1]])
        {
            sum+=m[str[i+1]]-m[str[i]];
            i++;
            continue;
        }
        sum += m[str[i]];
    }
    return sum;
}
 
// Driver Code
int main()
{
    // Considering inputs given are valid
    string str = "MCMIV";
    cout << "Integer form of Roman Numeral is "
         << romanToDecimal(str) << endl;
 
    return 0;
}

Java

// Program to convert Roman
// Numerals to Numbers
import java.util.Map;
import java.util.HashMap;
 
class GFG{
     
private static final Map<Character,
                         Integer> roman = new HashMap<Character,
                                                      Integer>()
{{
    put('I', 1);
    put('V', 5);
    put('X', 10);
    put('L', 50);
    put('C', 100);
    put('D', 500);
    put('M', 1000);
}};
 
// This function returns value
// of a Roman symbol
private static int romanToInt(String s)
{
    int sum = 0;
    int n = s.length();
     
    for(int i = 0; i < n; i++)
    {
         
        // If present value is less than next value,
        // subtract present from next value and add the
        // resultant to the sum variable.
        if (i != n - 1 && roman.get(s.charAt(i)) <
                          roman.get(s.charAt(i + 1)))
        {
            sum += roman.get(s.charAt(i + 1)) -
                   roman.get(s.charAt(i));
            i++;
        }
        else
        {
            sum += roman.get(s.charAt(i));
        }
    }
    return sum;
}
 
// Driver Code
public static void main(String[] args)
{
     
      // Considering inputs given are valid
    String input = "MCMIV";
     
    System.out.print("Integer form of Roman Numeral is " +
                     romanToInt(input));
}
}
 
// This code is contributed by rahuldevgarg

Python3

# Program to convert Roman
# Numerals to Numbers
roman = {}
roman['I'] = 1
roman['V'] = 5
roman['X'] = 10
roman['L'] = 50
roman['C'] = 100
roman['D'] = 500
roman['M'] = 1000
     
# This function returns value
# of a Roman symbol
def romanToInt(s):
   sum = 0
   n = len(s)
 
   i = 0
   while i < n :
 
      # If present value is less than next value,
      # subtract present from next value and add the
      # resultant to the sum variable.
      # print(roman[s[i]],roman[s[i+1]])
      if (i != n - 1 and roman[s[i]] < roman[s[i + 1]]):
         sum += roman[s[i + 1]] - roman[s[i]]
         i += 2
         continue
      else:
         sum += roman[s[i]]
      i += 1
   return sum
 
# Driver Code
     
# Considering inputs given are valid
input = "MCMIV"
 
print(f"Integer form of Roman Numeral is {romanToInt(input)}")
 
# This code is contributed by shinjanpatra

C#

// Program to convert Roman
// Numerals to Numbers
using System;
using System.Collections.Generic;
 
public class GFG {
 
  static  Dictionary<char, int> roman = new Dictionary<char, int>();
 
 
  // This function returns value
  // of a Roman symbol
  public static int romanToInt(String s) {
    int sum = 0;
    int n = s.Length;
 
    for (int i = 0; i < n; i++) {
 
      // If present value is less than next value,
      // subtract present from next value and add the
      // resultant to the sum variable.
      if (i != n - 1 && roman[s[i]] < roman[s[i + 1]]) {
        sum += roman[s[i + 1]] - roman[s[i]];
        i++;
      } else {
        sum += roman[s[i]];
      }
    }
    return sum;
  }
 
  // Driver Code
  public static void Main(String[] args) {
 
    roman['I'] = 1;
    roman['V'] =5;
    roman['X'] =10;
    roman['L'] =50;
    roman['C'] =100;
    roman['D'] =500;
    roman['M'] =1000;
    // Considering inputs given are valid
    String input = "MCMIV";
 
    Console.Write("int form of Roman Numeral is " + romanToInt(input));
  }
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
// Program to convert Roman
// Numerals to Numbers
 
    var roman = new Map() ;
            roman.set('I', 1);
            roman.set('V', 5);
            roman.set('X', 10);
            roman.set('L', 50);
            roman.set('C', 100);
            roman.set('D', 500);
            roman.set('M', 1000);
     
    // This function returns value
    // of a Roman symbol
     function romanToInt( s) {
        var sum = 0;
        var n = s.length;
 
        for (i = 0; i < n; i++) {
 
            // If present value is less than next value,
            // subtract present from next value and add the
            // resultant to the sum variable.
            if (i != n - 1 && roman.get(s.charAt(i)) < roman.get(s.charAt(i + 1))) {
                sum += roman.get(s.charAt(i + 1)) - roman.get(s.charAt(i));
                i++;
            } else {
                sum += roman.get(s.charAt(i));
            }
        }
        return sum;
    }
 
    // Driver Code
     
        // Considering inputs given are valid
        var input = "MCMIV";
 
        document.write("Integer form of Roman Numeral is " + romanToInt(input));
 
// This code is contributed by Rajput-Ji
</script>
Producción

Integer form of Roman Numeral is 1904

Complejidad temporal – O(N)
Espacio auxiliar – O(1)

Otra solución: código más corto usando python

Java

// Java Program to convert Roman
// Numerals to Numbers
import java.io.*;
import java.util.*;
 
class GFG
{
    public static void romanToInt(String s)
    {
        Map<Character,Integer> translations=new HashMap<Character,Integer>(); 
 
         //Adding elements to map 
        translations.put('I',1); 
        translations.put('V',5); 
        translations.put('X',10); 
        translations.put('L',50); 
        translations.put('C',100); 
        translations.put('D',500); 
        translations.put('M',1000);
       
        s = s.replace("IV","IIII");
        s = s.replace("IX","VIIII");
        s = s.replace("XL","XXXX");
        s = s.replace("XC","LXXXX");
        s = s.replace("CD","CCCC");
        s = s.replace("CM","DCCCC");
          
        int number = 0;
        for (int i = 0; i < s.length(); i++)
        {
            number = number + (translations.get(s.charAt(i)));
        }
        System.out.println(number);
  }
    public static void main (String[] args)
    {
        romanToInt("MCMIV");
    }
}
 
// This code is contributed by kothavvsaakash

C#

// C# Program to convert Roman
// Numerals to Numbers
using System;
using System.Collections.Generic;
 
using System.Collections;
 
public class GFG {
    public static void romanToInt(String s)
    {
        var translations = new Dictionary<char, int>();
        // Adding elements to map
        translations['I'] = 1;
        translations['V'] = 5;
        translations['X'] = 10;
        translations['L'] = 50;
        translations['C'] = 100;
        translations['D'] = 500;
        translations['M'] = 1000;
        s = s.Replace("IV", "IIII");
        s = s.Replace("IX", "VIIII");
        s = s.Replace("XL", "XXXX");
        s = s.Replace("XC", "LXXXX");
        s = s.Replace("CD", "CCCC");
        s = s.Replace("CM", "DCCCC");
        var number = 0;
        for (int i = 0; i < s.Length; i++) {
            number = number + (translations[s[i]]);
        }
        Console.WriteLine(number);
    }
    public static void Main(String[] args)
    {
        romanToInt("MCMIV");
    }
}
 
// This code is contributed by Aarti_Rathi

Python3

def romanToInt(s):
        translations = {
            "I": 1,
            "V": 5,
            "X": 10,
            "L": 50,
            "C": 100,
            "D": 500,
            "M": 1000
        }
        number = 0
        s = s.replace("IV", "IIII").replace("IX", "VIIII")
        s = s.replace("XL", "XXXX").replace("XC", "LXXXX")
        s = s.replace("CD", "CCCC").replace("CM", "DCCCC")
        for char in s:
            number += translations[char]
        print(number)
         
romanToInt('MCMIV')

Javascript

<script>
 
function romanToInt(s){
     
    let translations = new Map()
     
    translations.set("I",1)
    translations.set("V",5)
    translations.set("X",10)
    translations.set("L",50)
    translations.set("C",100)
    translations.set("D",500)
    translations.set("M",1000)
 
 
    let number = 0
    s = s.replace("IV", "IIII").replace("IX", "VIIII")
    s = s.replace("XL", "XXXX").replace("XC", "LXXXX")
    s = s.replace("CD", "CCCC").replace("CM", "DCCCC")
    for(let char of s)
        number += translations.get(char)
    document.write(number)
}
         
romanToInt('MCMIV')
 
// code is contributed by shinjanpatra
 
</script>
Producción

1904

Complejidad temporal – O(N)
Espacio auxiliar – O(1)

Este artículo es una contribución de Rahul Agrawal . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *