Java Program For Converting Roman Numerals To Decimal Lying Between 1 to 3999 - GeeksforGeeks

08 Feb, 2022
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.
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.
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.
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
// Java Program to convert Roman// Numerals to Numbersimport 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));    }}
  
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
// Java Program to convert Roman// Numerals to Numbersimport 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 symbolprivate 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 Codepublic 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! 
surinderdawra388
Amazon
base-conversion
Facebook
Microsoft
Twitter
Zoho
Algorithms
Java Programs
Strings
Zoho
Amazon
Microsoft
Facebook
Twitter
Strings
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
DSA Sheet by Love Babbar
Quadratic Probing in Hashing
Difference between Informed and Uninformed Search in AI
K means Clustering - Introduction
SCAN (Elevator) Disk Scheduling Algorithms
Initializing a List in Java
Convert a String to Character array in Java
Java Programming Examples
Convert Double to Integer in Java
Implementing a Linked List in Java using Class