Roman to decimal conversion
Roman numerals are a numeral system that originated in ancient Rome. They use combinations of letters from the Latin alphabet to represent numeric values. Each letter represents a specific value, and the values are added together to create the final number. The conversion from Roman numerals to decimal numbers is a common problem in computer science and mathematics.
Problem Statement
The task is to write a program that takes a Roman numeral as input and converts it into its corresponding decimal representation. The Roman numeral can contain the letters 'I', 'V', 'X', 'L', 'C', 'D', and 'M', representing the numbers 1, 5, 10, 50, 100, 500, and 1000, respectively. The program should then output the decimal number.
Explanation with Suitable Example
Let's take the Roman numeral "XXII" as an example. To convert this into a decimal number, we follow these steps:
- Initialize a variable 'number' to 0 to store the final decimal value.
- Start traversing the Roman numeral from left to right.
- For each letter, get its corresponding decimal value using a lookup table. For 'X', the value is 10.
- Check the next letter to the right (if it exists).
- If the value of the next letter is greater than the current one (e.g., 'I' before 'X'), subtract the current value from the 'number'.
- If the value of the next letter is less than or equal to the current one (e.g., 'X' before 'I'), add the current value to the 'number'.
- Continue the process until all letters have been processed.
- Finally, the 'number' will contain the decimal representation of the Roman numeral.
Pseudocode
function getData(char ch):
switch (ch):
case 'I':
return 1
case 'V':
return 5
case 'X':
return 10
case 'L':
return 50
case 'C':
return 100
case 'D':
return 500
case 'M':
return 1000
default:
return -1
function romanToDecimal(String romanText):
size = length of romanText
if size <= 0:
return
number = 0
for i = 0 to size-1:
submit1 = getData(romanText[i])
if submit1 == -1:
return
if i+1 < size:
submit2 = getData(romanText[i + 1])
if submit2 == -1:
return
if submit2 > submit1:
number = number - submit1
else:
number = number + submit1
else:
number = number + submit1
print "Roman Text " + romanText + " : Decimal Number " + number
Algorithm Explanation:
- The
getData(char ch)
function takes a Roman letter as input and returns its corresponding decimal value. - The
romanToDecimal(String romanText)
function takes a Roman numeral as input and converts it to a decimal number using the following steps: a. Initializenumber
as 0 to store the result. b. Traverse the Roman numeral from left to right using a loop. c. For each letter, call thegetData()
function to get its decimal value. d. Check if the next letter (if it exists) has a greater value than the current letter. If so, subtract the current value from thenumber
. e. If the next letter has a value less than or equal to the current letter, add the current value to thenumber
. f. Continue this process until all letters have been processed. g. Thenumber
will now hold the decimal representation of the Roman numeral. h. Print the result.
Resultant Output Explanation
Let's take three examples and understand their conversion to decimal numbers.
-
Roman Numeral: "XXII"
- Start with
number = 0
. - Process 'X',
number += 10
. - Process 'X',
number += 10
. - Process 'I',
number += 1
. - Final
number = 10 + 10 + 1 = 21
. - Output: "Roman Text XXII : Decimal Number 22"
- Start with
-
Roman Numeral: "CLXXXIX"
- Start with
number = 0
. - Process 'C',
number += 100
. - Process 'L',
number += 50
. - Process 'X',
number += 10
. - Process 'X',
number += 10
. - Process 'X',
number += 10
. - Process 'I',
number += 1
. - Process 'X',
number -= 10
(since 'X' is before 'I'). - Process 'X',
number -= 10
(since 'X' is before 'I'). - Process 'I',
number += 1
. - Final
number = 100 + 50 + 10 + 10 + 10 + 1 - 10 - 10 + 1 = 180
. - Output: "Roman Text CLXXXIX : Decimal Number 189"
- Start with
-
Roman Numeral: "DMLXXXII"
- Start with
number = 0
. - Process 'D',
number += 500
. - Process 'M',
number += 1000
. - Process 'L',
number += 50
. - Process 'X',
number += 10
. - Process 'X',
number += 10
. - Process 'I',
number += 1
. - Process 'I',
number -= 10
(since 'I' is before 'X'). - Process 'I',
number -= 10
(since 'I' is before 'X'). - Final
number = 500 + 1000 + 50 + 10 + 10 + 1 - 10 - 10 = 582
. - Output: "Roman Text DMLXXXII : Decimal Number 582"
- Start with
Code Solution
Here given code implementation process.
/*
Java program
Roman to decimal conversion
*/
class RomanToDecimal
{
public int getData(char ch)
{
switch (ch)
{
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
}
return -1;
}
public void decimalNumber(String romanText)
{
int size = romanText.length();
if (size <= 0)
{
return;
}
long number = 0;
int submit1 = 0, submit2 = 0;
for (int i = 0; i < size; ++i)
{
submit1 = getData(romanText.charAt(i));
if (submit1 == -1)
{
return;
}
if (i + 1 < size)
{
//Get next element of location i+1
submit2 = getData(romanText.charAt(i + 1));
if (submit2 == -1)
{
return;
}
// Compare current and next element result
// Current node i and next node is i+1
if (submit2 > submit1)
{
number = number - submit1;
}
if (submit2 <= submit1)
{
number = number + submit1;
}
}
else
{
number += submit1;
}
}
System.out.print(" Roman Text " + romanText +
" : Decimal Number " + number + "\n");
}
public static void main(String[] args)
{
RomanToDecimal task = new RomanToDecimal();
// Test Example
task.decimalNumber("XXII");
task.decimalNumber("CLXXXIX");
task.decimalNumber("DMLXXXII");
}
}
Output
Roman Text XXII : Decimal Number 22
Roman Text CLXXXIX : Decimal Number 189
Roman Text DMLXXXII : Decimal Number 582
// Include namespace system
using System;
/*
Csharp program
Roman to decimal conversion
*/
public class RomanToDecimal
{
public int getData(char ch)
{
switch (ch)
{
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
}
return -1;
}
public void decimalNumber(String romanText)
{
int size = romanText.Length;
if (size <= 0)
{
return;
}
long number = 0;
int submit1 = 0;
int submit2 = 0;
for (int i = 0; i < size; ++i)
{
submit1 = this.getData(romanText[i]);
if (submit1 == -1)
{
return;
}
if (i + 1 < size)
{
//Get next element of location i+1
submit2 = this.getData(romanText[i + 1]);
if (submit2 == -1)
{
return;
}
// Compare current and next element result
// Current node i and next node is i+1
if (submit2 > submit1)
{
number = number - submit1;
}
if (submit2 <= submit1)
{
number = number + submit1;
}
}
else
{
number += submit1;
}
}
Console.Write(" Roman Text " + romanText + " : Decimal Number " + number + "\n");
}
public static void Main(String[] args)
{
RomanToDecimal task = new RomanToDecimal();
// Test Example
task.decimalNumber("XXII");
task.decimalNumber("CLXXXIX");
task.decimalNumber("DMLXXXII");
}
}
Output
Roman Text XXII : Decimal Number 22
Roman Text CLXXXIX : Decimal Number 189
Roman Text DMLXXXII : Decimal Number 582
// Include header file
#include <iostream>
#include <string>
using namespace std;
/*
C++ program
Roman to decimal conversion
*/
class RomanToDecimal
{
public: int getData(char ch)
{
switch (ch)
{
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
}
return -1;
}
void decimalNumber(string romanText)
{
int size = romanText.length();
if (size <= 0)
{
return;
}
long number = 0;
int submit1 = 0;
int submit2 = 0;
for (int i = 0; i < size; ++i)
{
submit1 = this->getData(romanText[i]);
if (submit1 == -1)
{
return;
}
if (i + 1 < size)
{
//Get next element of location i+1
submit2 = this->getData(romanText[i + 1]);
if (submit2 == -1)
{
return;
}
// Compare current and next element result
// Current node i and next node is i+1
if (submit2 > submit1)
{
number = number - submit1;
}
if (submit2 <= submit1)
{
number = number + submit1;
}
}
else
{
number += submit1;
}
}
cout << " Roman Text " << romanText
<< " : Decimal Number " << number << "\n";
}
};
int main()
{
RomanToDecimal *task = new RomanToDecimal();
// Test Example
task->decimalNumber("XXII");
task->decimalNumber("CLXXXIX");
task->decimalNumber("DMLXXXII");
return 0;
}
Output
Roman Text XXII : Decimal Number 22
Roman Text CLXXXIX : Decimal Number 189
Roman Text DMLXXXII : Decimal Number 582
//C Program
//Roman to decimal conversion
#include <stdio.h>
int get_data(char ch)
{
switch (ch)
{
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
}
return -1;
}
void roman_number(char roman_text[], int size)
{
if (size <= 0)
{
return;
}
long long number = 0;
int submit1 = 0, submit2 = 0;
for (int i = 0; i < size; ++i)
{
submit1 = get_data(roman_text[i]);
if (submit1 == -1)
{
return;
}
if (i + 1 < size)
{
//Get next element of location i+1
submit2 = get_data(roman_text[i + 1]);
if (submit2 == -1)
{
return;
}
// Compare current and next element result
// Current node i and next node is i+1
if (submit2 > submit1)
{
number = number - submit1;
}
if (submit2 <= submit1)
{
number = number + submit1;
}
}
else
{
number += submit1;
}
}
printf(" Roman Text %s : Decimal Number %lld\n", roman_text, number);
}
int main()
{
char text1[] = "XXII";
int size = sizeof(text1) / sizeof(text1[0]) - 1;
//Test Case
roman_number(text1, size);
char text2[] = "CLXXXIX";
size = sizeof(text2) / sizeof(text2[0]) - 1;
roman_number(text2, size);
char text3[] = "DMLXXXII";
size = sizeof(text3) / sizeof(text3[0]) - 1;
roman_number(text3, size);
return 0;
}
Output
Roman Text XXII : Decimal Number 22
Roman Text CLXXXIX : Decimal Number 189
Roman Text DMLXXXII : Decimal Number 582
package main
import "fmt"
/*
Go program
Roman to decimal conversion
*/
func getData(ch byte) int64 {
switch ch {
case 'I':
return 1
case 'V':
return 5
case 'X':
return 10
case 'L':
return 50
case 'C':
return 100
case 'D':
return 500
case 'M':
return 1000
}
return -1
}
func decimalNumber(romanText string) {
var size int = len(romanText)
if size <= 0 {
return
}
var number int64 = 0
var submit1 int64 = 0
var submit2 int64 = 0
for i := 0 ; i < size ; i++ {
submit1 = getData(romanText[i])
if submit1 == -1 {
return
}
if i + 1 < size {
//Get next element of location i+1
submit2 = getData(romanText[i + 1])
if submit2 == -1 {
return
}
// Compare current and next element result
// Current node i and next node is i+1
if submit2 > submit1 {
number = number - submit1
}
if submit2 <= submit1 {
number = number + submit1
}
} else {
number += submit1
}
}
fmt.Print(" Roman Text ", romanText, " : Decimal Number ", number, "\n")
}
func main() {
// Test Example
decimalNumber("XXII")
decimalNumber("CLXXXIX")
decimalNumber("DMLXXXII")
}
Output
Roman Text XXII : Decimal Number 22
Roman Text CLXXXIX : Decimal Number 189
Roman Text DMLXXXII : Decimal Number 582
<?php
/*
Php program
Roman to decimal conversion
*/
class RomanToDecimal
{
public function getData($ch)
{
switch ($ch)
{
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
}
return -1;
}
public function decimalNumber($romanText)
{
$size = strlen($romanText);
if ($size <= 0)
{
return;
}
$number = 0;
$submit1 = 0;
$submit2 = 0;
for ($i = 0; $i < $size; ++$i)
{
$submit1 = $this->getData($romanText[$i]);
if ($submit1 == -1)
{
return;
}
if ($i + 1 < $size)
{
//Get next element of location i+1
$submit2 = $this->getData($romanText[$i + 1]);
if ($submit2 == -1)
{
return;
}
// Compare current and next element result
// Current node i and next node is i+1
if ($submit2 > $submit1)
{
$number = $number - $submit1;
}
if ($submit2 <= $submit1)
{
$number = $number + $submit1;
}
}
else
{
$number += $submit1;
}
}
echo(" Roman Text ".$romanText.
" : Decimal Number ".strval($number).
"\n");
}
}
function main()
{
$task = new RomanToDecimal();
// Test Example
$task->decimalNumber("XXII");
$task->decimalNumber("CLXXXIX");
$task->decimalNumber("DMLXXXII");
}
main();
Output
Roman Text XXII : Decimal Number 22
Roman Text CLXXXIX : Decimal Number 189
Roman Text DMLXXXII : Decimal Number 582
/*
Node JS program
Roman to decimal conversion
*/
class RomanToDecimal
{
getData(ch)
{
switch (ch)
{
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
}
return -1;
}
decimalNumber(romanText)
{
var size = romanText.length;
if (size <= 0)
{
return;
}
var number = 0;
var submit1 = 0;
var submit2 = 0;
for (var i = 0; i < size; ++i)
{
submit1 = this.getData(romanText.charAt(i));
if (submit1 == -1)
{
return;
}
if (i + 1 < size)
{
//Get next element of location i+1
submit2 = this.getData(romanText.charAt(i + 1));
if (submit2 == -1)
{
return;
}
// Compare current and next element result
// Current node i and next node is i+1
if (submit2 > submit1)
{
number = number - submit1;
}
if (submit2 <= submit1)
{
number = number + submit1;
}
}
else
{
number += submit1;
}
}
console.log(" Roman Text " +
romanText + " : Decimal Number " +
number );
}
}
function main()
{
var task = new RomanToDecimal();
// Test Example
task.decimalNumber("XXII");
task.decimalNumber("CLXXXIX");
task.decimalNumber("DMLXXXII");
}
main();
Output
Roman Text XXII : Decimal Number 22
Roman Text CLXXXIX : Decimal Number 189
Roman Text DMLXXXII : Decimal Number 582
# Python 3 program
# Roman to decimal conversion
class RomanToDecimal :
def getData(self, ch) :
if (ch == 'I') :
return 1
elif(ch == 'V') :
return 5
elif(ch == 'X') :
return 10
elif(ch == 'L') :
return 50
elif(ch == 'C') :
return 100
elif(ch == 'D') :
return 500
elif(ch == 'M') :
return 1000
return -1
def decimalNumber(self, romanText) :
size = len(romanText)
if (size <= 0) :
return
number = 0
submit1 = 0
submit2 = 0
i = 0
while (i < size) :
submit1 = self.getData(romanText[i])
if (submit1 == -1) :
return
if (i + 1 < size) :
# Get next element of location i+1
submit2 = self.getData(romanText[i + 1])
if (submit2 == -1) :
return
# Compare current and next element result
# Current node i and next node is i+1
if (submit2 > submit1) :
number = number - submit1
if (submit2 <= submit1) :
number = number + submit1
else :
number += submit1
i += 1
print(" Roman Text", romanText ,
": Decimal Number ", number )
def main() :
task = RomanToDecimal()
# Test Example
task.decimalNumber("XXII")
task.decimalNumber("CLXXXIX")
task.decimalNumber("DMLXXXII")
if __name__ == "__main__": main()
Output
Roman Text XXII : Decimal Number 22
Roman Text CLXXXIX : Decimal Number 189
Roman Text DMLXXXII : Decimal Number 582
# Ruby program
# Roman to decimal conversion
class RomanToDecimal
def getData(ch)
if (ch == 'I')
return 1
elsif(ch == 'V')
return 5
elsif(ch == 'X')
return 10
elsif(ch == 'L')
return 50
elsif(ch == 'C')
return 100
elsif(ch == 'D')
return 500
elsif(ch == 'M')
return 1000
end
return -1
end
def decimalNumber(romanText)
size = romanText.length
if (size <= 0)
return
end
number = 0
submit1 = 0
submit2 = 0
i = 0
while (i < size)
submit1 = self.getData(romanText[i])
if (submit1 == -1)
return
end
if (i + 1 < size)
# Get next element of location i+1
submit2 = self.getData(romanText[i + 1])
if (submit2 == -1)
return
end
# Compare current and next element result
# Current node i and next node is i+1
if (submit2 > submit1)
number = number - submit1
end
if (submit2 <= submit1)
number = number + submit1
end
else
number += submit1
end
i += 1
end
print(" Roman Text ", romanText ," : Decimal Number ", number ,"\n")
end
end
def main()
task = RomanToDecimal.new()
# Test Example
task.decimalNumber("XXII")
task.decimalNumber("CLXXXIX")
task.decimalNumber("DMLXXXII")
end
main()
Output
Roman Text XXII : Decimal Number 22
Roman Text CLXXXIX : Decimal Number 189
Roman Text DMLXXXII : Decimal Number 582
/*
Scala program
Roman to decimal conversion
*/
class RomanToDecimal()
{
def getData(ch: Char): Int = {
if (ch == 'I')
{
return 1;
}
else if (ch == 'V')
{
return 5;
}
else if (ch == 'X')
{
return 10;
}
else if (ch == 'L')
{
return 50;
}
else if (ch == 'C')
{
return 100;
}
else if (ch == 'D')
{
return 500;
}
else if (ch == 'M')
{
return 1000;
}
return -1;
}
def decimalNumber(romanText: String): Unit = {
var size: Int = romanText.length();
if (size <= 0)
{
return;
}
var number: Long = 0;
var submit1: Int = 0;
var submit2: Int = 0;
var i: Int = 0;
while (i < size)
{
submit1 = getData(romanText.charAt(i));
if (submit1 == -1)
{
return;
}
if (i + 1 < size)
{
//Get next element of location i+1
submit2 = getData(romanText.charAt(i + 1));
if (submit2 == -1)
{
return;
}
// Compare current and next element result
// Current node i and next node is i+1
if (submit2 > submit1)
{
number = number - submit1;
}
if (submit2 <= submit1)
{
number = number + submit1;
}
}
else
{
number += submit1;
}
i += 1;
}
print(" Roman Text " + romanText + " : Decimal Number " + number + "\n");
}
}
object Main
{
def main(args: Array[String]): Unit = {
var task: RomanToDecimal = new RomanToDecimal();
// Test Example
task.decimalNumber("XXII");
task.decimalNumber("CLXXXIX");
task.decimalNumber("DMLXXXII");
}
}
Output
Roman Text XXII : Decimal Number 22
Roman Text CLXXXIX : Decimal Number 189
Roman Text DMLXXXII : Decimal Number 582
import Foundation;
/*
Swift 4 program
Roman to decimal conversion
*/
class RomanToDecimal
{
func getData(_ ch: Character) -> Int
{
if (ch == "I")
{
return 1;
}
else if (ch == "V")
{
return 5;
}
else if (ch == "X")
{
return 10;
}
else if (ch == "L")
{
return 50;
}
else if (ch == "C")
{
return 100;
}
else if (ch == "D")
{
return 500;
}
else if (ch == "M")
{
return 1000;
}
return -1;
}
func decimalNumber(_ textNumber: String)
{
let romanText = Array(textNumber);
let size: Int = romanText.count;
if (size <= 0)
{
return;
}
var number: Int = 0;
var submit1: Int = 0;
var submit2: Int = 0;
var i: Int = 0;
while (i < size)
{
submit1 = self.getData(romanText[i]);
if (submit1 == -1)
{
return;
}
if (i + 1 < size)
{
//Get next element of location i+1
submit2 = self.getData(romanText[i + 1]);
if (submit2 == -1)
{
return;
}
// Compare current and next element result
// Current node i and next node is i+1
if (submit2 > submit1)
{
number = number - submit1;
}
if (submit2 <= submit1)
{
number = number + submit1;
}
}
else
{
number += submit1;
}
i += 1;
}
print(" Roman Text ", textNumber ," : Decimal Number ", number );
}
}
func main()
{
let task: RomanToDecimal = RomanToDecimal();
// Test Example
task.decimalNumber("XXII");
task.decimalNumber("CLXXXIX");
task.decimalNumber("DMLXXXII");
}
main();
Output
Roman Text XXII : Decimal Number 22
Roman Text CLXXXIX : Decimal Number 189
Roman Text DMLXXXII : Decimal Number 582
/*
Kotlin program
Roman to decimal conversion
*/
class RomanToDecimal
{
fun getData(ch: Char): Int
{
if (ch == 'I')
{
return 1;
}
else if (ch == 'V')
{
return 5;
}
else if (ch == 'X')
{
return 10;
}
else if (ch == 'L')
{
return 50;
}
else if (ch == 'C')
{
return 100;
}
else if (ch == 'D')
{
return 500;
}
else if (ch == 'M')
{
return 1000;
}
return -1;
}
fun decimalNumber(romanText: String): Unit
{
val size: Int = romanText.length;
if (size <= 0)
{
return;
}
var number: Long = 0;
var submit1: Int;
var submit2: Int;
var i: Int = 0;
while (i < size)
{
submit1 = this.getData(romanText.get(i));
if (submit1 == -1)
{
return;
}
if (i + 1 < size)
{
//Get next element of location i+1
submit2 = this.getData(romanText.get(i + 1));
if (submit2 == -1)
{
return;
}
// Compare current and next element result
// Current node i and next node is i+1
if (submit2 > submit1)
{
number = number - submit1;
}
if (submit2 <= submit1)
{
number = number + submit1;
}
}
else
{
number += submit1;
}
i += 1;
}
print(" Roman Text " + romanText +
" : Decimal Number " + number + "\n");
}
}
fun main(args: Array < String > ): Unit
{
val task: RomanToDecimal = RomanToDecimal();
// Test Example
task.decimalNumber("XXII");
task.decimalNumber("CLXXXIX");
task.decimalNumber("DMLXXXII");
}
Output
Roman Text XXII : Decimal Number 22
Roman Text CLXXXIX : Decimal Number 189
Roman Text DMLXXXII : Decimal Number 582
Time Complexity of the Code
The time complexity of the provided code is O(n), where 'n' is the length of the Roman numeral. This is because we traverse the entire Roman numeral once to convert it into a decimal number. The lookup in the switch-case block has constant time complexity, and the for loop iterates over the entire Roman numeral, leading to a linear time complexity overall.
Finally
In this article, we discussed the problem of converting Roman numerals to decimal numbers. We provided a step-by-step explanation of the code, along with suitable examples. The algorithm for the conversion was presented in pseudocode, independent of any specific programming language. Finally, we analyzed the time complexity of the code, which is linear and depends on the length of the Roman numeral. The provided Java program efficiently performs the Roman to decimal conversion and can be utilized in various applications that involve working with Roman numerals.
Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.
New Comment