Converting Roman Numerals to Decimal lying between 1 to 3999

04 Jul, 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: 
C++
C
Java
Python
C#
PHP
Javascript
// Program to convert Roman// Numerals to Numbers#include <bits/stdc++.h>using namespace std; // This function returns value// of a Roman symbolint 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 numaralint 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 Codeint main(){    // Considering inputs given are valid    string str = "MCMIV";    cout << "Integer form of Roman Numeral is "         << romanToDecimal(str) << endl;     return 0;}
// Program to convert Roman// Numerals to Numbers#include <stdio.h>#include <string.h> // This function returns value// of a Roman symbolint 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 numaralint 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 Codeint main(){    // Considering inputs given are valid    char str[10] = "MCMIV";    printf("Integer form of Roman Numeral is %d",romanToDecimal(str));      return 0;}
// 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 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 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 codeprint("Integer form of Roman Numeral is"),print(romanToDecimal("MCMIV"))
// C# Program to convert Roman// Numerals to Numbersusing 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// Program to convert Roman// Numerals to Numbers // This function returns// value of a Roman symbolfunction 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 numeralfunction 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?>
<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++
Java
Python3
C#
Javascript
// Program to convert Roman// Numerals to Numbers#include <bits/stdc++.h>using namespace std; // This function returns value// of a Roman symbolint 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 Codeint main(){    // Considering inputs given are valid    string str = "MCMIV";    cout << "Integer form of Roman Numeral is "         << romanToDecimal(str) << endl;     return 0;}
// 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
# Program to convert Roman# Numerals to Numbersroman = {}roman['I'] = 1roman['V'] = 5roman['X'] = 10roman['L'] = 50roman['C'] = 100roman['D'] = 500roman['M'] = 1000     # This function returns value# of a Roman symboldef 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 validinput = "MCMIV" print(f"Integer form of Roman Numeral is {romanToInt(input)}") # This code is contributed by shinjanpatra
// Program to convert Roman// Numerals to Numbersusing 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
<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
C#
Python3
Javascript
// Java Program to convert Roman// Numerals to Numbersimport 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# Program to convert Roman// Numerals to Numbersusing 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
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')
<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. 
jit_t
shrikanth13
yashjaiswal10
RajaKumar17
andrew1234
cyrus18
rachitsharma19962000
rahuldevgarg
umadevi9616
shradhaagarwal
kumarabhinav3125
Rajput-Ji
surinderdawra388
shinjanpatra
pariveshsrivastava1093
kothavvsaakash
codewithshinchan
hardikkoriintern
Amazon
base-conversion
Facebook
Microsoft
Twitter
Zoho
Algorithms
Strings
Zoho
Amazon
Microsoft
Facebook
Twitter
Strings
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
DSA Sheet by Love Babbar
SDE SHEET - A Complete Guide for SDE Preparation
Top 50 Array Coding Problems for Interviews
What is Hashing | A Complete Tutorial
Difference between BFS and DFS
Write a program to reverse an array or string
Reverse a string in Java
Write a program to print all permutations of a given string
C++ Data Types
Different Methods to Reverse a String in C++