Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
/*roman background
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
Numbers are formed by combining symbols together and adding the values.
Symbols are placed from left to right in order of value, starting with the largest
in a few specific cases,to avoid four characters being repeated in succession (such as IIII or XXXX) these can be reduced using subtractive notation as follows:
the numeral I can be placed before V and X to make 4 units (IV) and 9 units (IX respectively)
X can be placed before L and C to make 40 (XL) and 90 (XC respectively)
C can be placed before D and M to make 400 (CD) and 900 (CM) according to the same pattern
*/
/*algorithm iterative version
for number n,according to n's value
1)try subtractive value (1000,...1) from n
2)loop this process
*/
string intToRoman(int num) {
unordered_map<int,string>table={
{1,"I"},{4,"IV"},{5,"V"},{9,"IX"},{10,"X"},
{40,"XL"},{50,"L"},{90,"XC"},{100,"C"},
{400,"CD"},{500,"D"},{900,"CM"},{1000,"M"}
};
string r;
//for code simplicity,use array to omiit too much condition check
int keys[13]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
for(;num;){
for(int k = 0;k < 13;k++){
if(num >= keys[k]){
r.append(table[keys[k]]);
num -= keys[k];
break;
}
}
}
return r;
}