# Converting Roman Numerals to Decimal lying between 1 to 3999

Last Updated : 29 Feb, 2024

Given a Roman numeral, the task is to find its corresponding decimal value.

Example :

Input: IX
Output: 9
Explanation: IX is a Roman symbol which represents 9

Input: XL
Output: 40
Explanation: XL is a Roman symbol which represents 40

Input: MCMIV
Output: 1904
Explanation: M is a thousand, CM is nine hundred and IV is four

Recommended Practice

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 ` `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 ` `#include `   `// 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`

## Javascript

 ``

## PHP

 `= ``\$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` `?>`

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.
• Auxiliary Space: O(1), As no extra space is required.

Previous
Next