Converting Roman Numerals to Decimal lying between 1 to 3999

Given a Romal 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:

  1. Split the Roman Numeral string into Roman Symbols (character).
  2. Convert each symbol of Roman Numerals into the value it represents.
  3. Take symbol one by one from starting from index 0:
    1. If current value of symbol is greater than or equal to the value of next symbol, then add this value to the running total.
    2. else subtract this value by adding the value of next symbol to the running total.

Following is the implementation of the above algorithm:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 Program
int main()
{
    // Considering inputs given are valid
    string str = "MCMIV";
    cout << "Integer form of Roman Numeral is "
         << romanToDecimal(str) << endl;
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
                i++;
            }
        }
  
        return res;
    }
  
    // Driver method
    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));
    }
}

chevron_right


Python

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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")) 

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 romal 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

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?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
?>

chevron_right



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.

Alternate Implementation in Python:
Approach: This approach is very similar to the previous one. In this approach traverse the string from the n-1 th position to the 0th index. There are 7 charactersalong with there mapped values. Check if the current value is greater than or equal to the previous character then add it to the sum else subtract it from the sum. Initially value of p is zero.

filter_none

edit
close

play_arrow

link
brightness_4
code

def romanToInt(rom):
    value = {
        'M': 1000,
        'D': 500,
        'C': 100,
        'L': 50,
        'X': 10,
        'V': 5,
        'I': 1
    }
  
    # Initialize previous character and answer
    p = 0
    ans = 0
      
    # Traverse through all characters
    n = len(rom) 
    for i in range(n-1, -1, -1):
  
        # If greater than or equal to previous,
        # add to answer 
        if value[rom[i]] >= p:
            ans += value[rom[i]]
  
        # If smaller than previous  
        else:
            ans -= value[rom[i]]
  
        # Update previous
        p = value[rom[i]]
  
    print(ans)
  
romanToInt('MCMIV')

chevron_right


Output:

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.

References: https://en.wikipedia.org/wiki/Roman_numerals

This article is contributed by Rahul Agrawal .If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

Don’t stop now and take your learning to the next level. Learn all the important concepts of Data Structures and Algorithms with the help of the most trusted course: DSA Self Paced. Become industry ready at a student-friendly price.




My Personal Notes arrow_drop_up