Integer To Roman Numeral
Given an integer ‘N’, the task is to find its corresponding Roman numeral.
Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
Example :
2 is written as II in the roman numeral, just two one’s added together.
12 is written as XII, which is simply X(ten) + II(one+one).
The number 27 is written as XXVII, which is XX + V + II.
Roman numerals are usually written largest to smallest from left to right.
However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four.
The same principle applies to the number nine, which is written as IX.
There are six instances where subtraction is used:
I can be placed before V (5) and X (10) to make 4 and 9.
X can be placed before L (50) and C (100) to make 40 and 90.
C can be placed before D (500) and M (1000) to make 400 and 900.
Input Format :
The first line of input contains an integer ‘T’ denoting the number of test cases.
Then the test cases follow.
The only line of each test case contains an integer ‘N’.
Output Format :
For each test case, the only line of output prints the corresponding roman numeral for the given integer ‘N’.
Note:
You do not need to print anything, it has already been taken care of. Just implement the given function.
Constraints:
1 <= T <= 10^2
1 <= N <= 4*10^3 - 1
Time Limit : 1 sec
The idea is to convert each digit present at units, tens, hundreds and thousands places of the given number into roman numerals separately. Also, the conversion of some digits are a little bit different from other digits because these digits follow subtractive notation, i.e. 4 can be represented as “IV”, 9 can be represented as “IX” and so on.
Here is the algorithm :
- Compare the given number with the base value in the order from largest to smallest.
- The base value which is just smaller or equal to the given number will be the initial base value.
- Divide the number by this base value and corresponding base symbol will be repeated number/base i.e. quotient number of times.
- Now, the remainder will be the number for next iterations.
- These steps will be repeated until the number becomes zero.
For example, the roman numeral for the number 1749 will be “MDCCXLIX”.
Explanation :
Step 1 :
- Initially number = 1749
- Since 1749 >= 1000; the largest base value will be 1000 initially.
- Divide 1749/1000. Quotient = 1, Remainder = 749. The corresponding symbol M will be repeated once.
Step 2 :
- Now, number = 749
- 1000 > 749 >= 500; the largest base value will be 500.
- Divide 749/500. Quotient = 1, Remainder = 249. The corresponding symbol D will be repeated once.
Step 3 :
- Now, number = 249
- 400 > 249 >= 100; the largest base value will be 100.
- Divide 249/100. Quotient = 2, Remainder = 49. The corresponding symbol C will be repeated twice.
Step 4 :
- Now, number = 49
- 50 > 49 >= 40; the largest base value is 40.
- Divide 49/40. Quotient = 1, Remainder = 9. The corresponding symbol XL will be repeated once.
Step 5 :
- Now, number = 9
- 10 > 9 >= 9; the largest base value is 9.
- Divide 9/9. Quotient = 1, Remainder = 0. The corresponding symbol IX will be repeated once.
Step 6:
- Finally, the number becomes 0, the algorithm stops here.
- The output obtained “MDCCXLIX”.
In this approach, we will use the most significant digit (MSD) in the number. For example, in 1234, the most significant digit is 1, and for 345, it will be 3. To get this most significant digit for a number,we will maintain a divisor (say, ‘DIV’) like 1000 for 1234 (since 1234/1000 = 1) and 100 for 345 (345 / 100 = 3).
Also, we will maintain a dictionary (HashMap in Java) (say, ‘romanNumeral’), which contains all the keys as the base value and the value as its corresponding base symbol i.e. ‘roman numeral’, i.e. {1 : ‘I’, 5 : ‘V’, 10 : ‘X’, 50 : ‘L’, 100 : ‘C’, 500 : ‘D’, 1000 : ‘M’}.
Here is the algorithm :
- If “MSD” <= 3, add ‘romanNumeral’[DIV] * ‘MSD’ in the answer string.
- If “MSD” == 4, this is the case of subtractive notation. So, add ‘romanNumeral’[DIV] and ‘romanNumeral’[DIV * 5] in the answer string.
- If 5 <= “MSD” <= 8, add ‘romanNumeral’[DIV * 5] and ('romanNumeral'[DIV] * ('MSD' - 5)) in the answer string.
- If “MSD” == 9, this is the case of subtractive notation. So, add 'romanNumeral'[DIV] and ‘romanNumeral’[DIV * 10] in the answer string.
For example, for the input number 3649,
- Initial number = 3649, ‘MSD’ = 3 and ‘DIV’ = 1000. So, ‘romanNumeral’[1000] * 3 will be added in the answer string, which gives “MMM”.
- Now number = 649, ‘MSD’ = 6 and ‘DIV’ = 100. So, ‘romanNumeral’[100*5] and ‘romanNumeral’[100] * (6 - 5) will be added in the answer string, which gives “DC”.
- Now number = 49, ‘MSD’ = 4 and ‘DIV’ = 10. So, ‘romanNumeral’[10] and ‘romanNumeral’[10*5] will be added in the answer string, which gives “XL”.
- Now number = 9, ‘MSD’ = 9 and ‘DIV’ = 1. So, ‘romanNumeral’[1] and ‘romanNumeral’[1*10] will be added in the answer string, which gives “IX”.
Thus, the final output obtained will be “MMMDCXLIX”.
It is mentioned in the problem statement that the number can’t be greater than 3999, i.e. it can have a maximum of 4 digits. So we will use this information to solve the problem.
Here is the algorithm :
- Divide the given number into digits present at different places like ones, tens, hundreds or thousands.
- Starting from the thousand’s place print the corresponding roman value. For example, if the digit at thousand’s place is 3 then print the roman equivalent of 3000.
- Repeat the second step until we reach one’s place.
Example :
Suppose the input number is 1749. So, starting from the thousand’s place we will start adding the roman equivalent in the answer string. In this case, we will add in the order as given below :
- Add the roman equivalent of 1749/1000=1, i.e. 1000, which is “M” (1000).
- Add the roman equivalent of (1749%1000)/100=7, i.e. 700, which is “DCC” (500 + 100 + 100).
- Add the roman equivalent of (1749%100)/10=4, i.e. 40, which is “XL” (50 - 10).
- Add the roman equivalent of 1749%10=9, which is “IX” (10 - 1).
So, the output obtained will be “MDCCXLIX”.