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:
- Divida la string de números romanos en símbolos romanos (carácter).
- Convierta cada símbolo de números romanos en el valor que representa.
- Tome el símbolo uno por uno desde el índice 0:
- Si el valor actual del símbolo es mayor o igual que el valor del siguiente símbolo, agregue este valor al total acumulado.
- 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>
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>
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>
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