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:
Java
// 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 romal 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)); } }
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 –
Java
// 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
Producción:
Integer form of Roman Numeral is 1904
Complejidad temporal – O(N)
Espacio auxiliar – O(1)
Consulte el artículo completo sobre la conversión de números romanos a decimales entre 1 y 3999 para obtener más detalles.
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