1.代码展示
char* intToRoman(int num)
{
int flag[26];
flag['I' - 'A'] = 1;
flag['V' - 'A'] = 5;
flag['X' - 'A'] = 10;
flag['L' - 'A'] = 50;
flag['C' - 'A'] = 100;
flag['D' - 'A'] = 500;
flag['M' - 'A'] = 1000;
int sum = 0;
int len = strlen(num);
for(int i = 0;i < len;i++)
{
int value = flag[s[i] - 'A'];
if(i < len - 1 && value < flag[s[i + 1] - 'A'])
{
sum -= value;
}
else
{
sum += value;
}
}
return sum;
}
2.思路解析
首先由题目可知,通常小的数字在大数字的右边,而还有特殊情况就是大数字在小数字右边,此时我们要分类讨论,所以用一个 value 来判断右边数字是否比当前位置数字更大,大则相加,小则相减,最终返回总和 。
所以我们现在知道了核心思路,便创建一个数组,用罗马数字的ASCII码减去A的ASCII码值,充当下标,分别初始赋值,最终根据逻辑思路相加即可。