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:
// 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));
}
} |
Output:
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 –
// 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 |
Output:
Integer form of Roman Numeral is 1904
Time complexity – O(N)
Auxiliary Space – O(1)
Please refer complete article on Converting Roman Numerals to Decimal lying between 1 to 3999 for more details!