/**************************************************************************
*
* 12. [Integer to Roman](https://leetcode.com/problems/integer-to-roman/)
*
* Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
* 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
**************************************************************************/
char * intToRoman(int num){
if (num < 1) return NULL;
int radix[13]={1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
char *symbol[13]={"M", "CM", "D", "CD", "C", "XC","L", "XL", "X", "IX", "V", "IV", "I"};
char *roman = (char *)calloc(64, sizeof(char));
int index = 0;
for (int i = 0; i < 13; i++) {
int count = num / radix[i];
while(count) {
int len = strlen(symbol[i]);
memcpy(&roman[index], symbol[i], len);
index += len;
count--;
}
num %= radix[i];
}
return roman;
}
/**************************************************************************
*
* 13. [Roman to Integer](https://leetcode.com/problems/roman-to-integer/)
*
**************************************************************************/
int romanToInt(char * s){
if (NULL == s) return 0;
int len = strlen(s);
int map[26] = {0};
map['I' - 'A'] = 1;
map['V' - 'A'] = 5;
map['X' - 'A'] = 10;
map['L' - 'A'] = 50;
map['C' - 'A'] = 100;
map['D' - 'A'] = 500;
map['M' - 'A'] = 1000;
int ret = 0;
for (int i = 0; i < len; i++) {
int val = map[s[i] - 'A'];
if (i == len - 1 || map[s[i+1] - 'A'] <= val)
ret += val;
else
ret -= val;
}
return ret;
}