Converting Roman Numerals to Decimal lying between 1 to 3999
Given a Roman numeral, the task is to find its corresponding decimal value.
Example :
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
Roman numerals are based on the following symbols.
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
Approach: A number in Roman Numerals is a string of these symbols written in descending order(e.g. M’s first, followed by D’s, etc.). However, in a few specific cases, to avoid four characters being repeated in succession(such as IIII or XXXX), subtractive notation is often used as follows:
- I placed before V or X indicates one less, so four is IV (one less than 5) and 9 is IX (one less than 10).
- X placed before L or C indicates ten less, so forty is XL (10 less than 50) and 90 is XC (ten less than a hundred).
- C placed before D or M indicates a hundred less, so four hundred is CD (a hundred less than five hundred) and nine hundred is CM (a hundred less than a thousand).
Algorithm to convert Roman Numerals to Integer Number:
- Split the Roman Numeral string into Roman Symbols (character).
- Convert each symbol of Roman Numerals into the value it represents.
- Take symbol one by one from starting from index 0:
- If current value of symbol is greater than or equal to the value of next symbol, then add this value to the running total.
- else subtract this value by adding the value of next symbol to the running total.
Following is the implementation of the above algorithm:
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
Complexity Analysis:
- Time Complexity: O(n), where n is the length of the string.
Only one traversal of the string is required. - Space Complexity: O(1).
As no extra space is required.
Another solution –
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
Time complexity – O(N)
Auxiliary Space – O(1)
Another Solution: Shorter code using 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
Time complexity – O(N)
Auxiliary Space – O(1)
This article is contributed by Rahul Agrawal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Roman to integer using Ladder If-Else approach :
This approach is basically follows the fundamental logic of roman numbers , just apply the condition in ladder form like if the first character is ‘I’ then next should be ‘V’ to make it 4 in number else it will be 1.
Implementation of the approach:
C++
// Program to convert Roman // Numerals to Numbers #include <bits/stdc++.h> using namespace std; int romanToDecimal(string s) { /* declare two variables first will calculate the number and second will help in iterating through the string character-wise*/ int ans=0,i; for ( i=0;i<s.size()-1;i++){ if (s[i]== 'I' &&s[i+1]== 'V' ) { ans+=4;i++; continue ; } else if (s[i]== 'I' &&s[i+1]== 'X' ) { ans+=9;i++; continue ; } else if (s[i]== 'X' &&s[i+1]== 'L' ) { ans+=40;i++; continue ; } else if (s[i]== 'X' &&s[i+1]== 'C' ) { ans+=90;i++; continue ; } else if (s[i]== 'C' &&s[i+1]== 'D' ) { ans+=400;i++; continue ; } else if (s[i]== 'C' &&s[i+1]== 'M' ) { ans+=900;i++; continue ; } //till this we checked all the category like 4,9,40,90 etc. else if (s[i]== 'I' ) ans+=1; else if (s[i]== 'V' ) ans+=5; else if (s[i]== 'X' ) ans+=10; else if (s[i]== 'L' ) ans+=50; else if (s[i]== 'C' ) ans+=100; else if (s[i]== 'D' ) ans+=500; else if (s[i]== 'M' ) ans+=1000; } /* for last character that left in the string if last two char comes not in the category of 4,9,40,90 etc as loop is iterating till size-1*/ if (s.size()>i){ if (s[i]== 'I' ) ans+=1; else if (s[i]== 'V' ) ans+=5; else if (s[i]== 'X' ) ans+=10; else if (s[i]== 'L' ) ans+=50; else if (s[i]== 'C' ) ans+=100; else if (s[i]== 'D' ) ans+=500; else if (s[i]== 'M' ) ans+=1000; } return ans; } // Driver Code int main() { // Considering inputs given are valid string str = "MCMIV" ; cout << "Integer form of Roman Numeral is " << romanToDecimal(str) << endl; return 0; } //this code is contributed by Prateek Kumar Singh |
Integer form of Roman Numeral is 1904
Time complexity – O(N)
Auxiliary Space – O(1)
Please Login to comment...