Given a Romal numeral, the task is to find its corresponding decimal value.
Examples
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:
<?php
// 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;
// Value of current symbol is
// less than the next symbol
$i++;
}
} 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), "";
?>
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.
Please refer complete article on Converting Roman Numerals to Decimal lying between 1 to 3999 for more details!