目录
题目来源:
13. 罗马数字转整数 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/roman-to-integer/
问题介绍
罗马数字包含以下七种字符: M
,D
,L
,X
,C
, V
,I
例如:
罗马数字 2 写做 II ,即为两个并列的 I 。
12 写做 XII ,即为 X + II 。
27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。
特殊情况
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
函数要求
给定一个罗马数字,将其转换成整数。
输入: s = "II" 输出: 2
输入: s = "IV" 输出: 4
输入: s = "LVIII" 输出: 58 解释: L = 50, V= 5, III = 3.
输入: s = "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4.
函数实现
int romanToInt(char* s)
{
int sum = 0;
while (*s)
{
if (*s == 'V') sum += 5;
else if (*s == 'L') sum += 50;
else if (*s == 'D') sum += 500;
else if (*s == 'M') sum += 1000;//V,L,D,M,I是普通罗马数字,直接加到sum中
else if (*s == 'I') //I,X,C特殊要视情况而定
{
if (*(s + 1) == 'V' || *(s + 1) == 'X') sum -= 1;
else sum += 1;
}
else if (*s == 'X')
{
if (*(s + 1) == 'L' || *(s + 1) == 'C') sum -= 10;
else sum += 10;
}
else if (*s == 'C')
{
if (*(s + 1) == 'D' || *(s + 1) == 'M') sum -= 100;
else sum += 100;
}
s++; //历遍s
}
return sum;
}
用法示例
#include<stdio.h>
int romanToInt(char* s)
{
int sum = 0;
while (*s)
{
if (*s == 'V') sum += 5;
else if (*s == 'L') sum += 50;
else if (*s == 'D') sum += 500;
else if (*s == 'M') sum += 1000;
else if (*s == 'I')
{
if (*(s + 1) == 'V' || *(s + 1) == 'X') sum -= 1;
else sum += 1;
}
else if (*s == 'X')
{
if (*(s + 1) == 'L' || *(s + 1) == 'C') sum -= 10;
else sum += 10;
}
else if (*s == 'C')
{
if (*(s + 1) == 'D' || *(s + 1) == 'M') sum -= 100;
else sum += 100;
}
s++;
}
return sum;
}
int main()
{
char s[] = { "MCMXCIV"};
printf("%d\n", romanToInt(s));
return 0;
}
结果展示
比较难想到的解法
int readRoman(char s) //返回罗马字母对应的数字
{
int n[] = { 1,5,10,50,100,500,1000 }, i = 0;
char strRoman[] = { "IVXLCDM" };
while (s != strRoman[i])
i++;
return n[i];
}
int romanToInt(char* s)
{
int sum = readRoman(s[0]);
int pre = readRoman(s[0]);//记录前一个罗马字符的数字大小
for (int i = 1; s[i] != '\0'; i++) //历遍s里的每个罗马字符
{
if (pre < readRoman(s[i])) //特殊情况:前一个罗马数字大于后一个罗马数字
{
sum = sum + readRoman(s[i]) - 2 * pre;//之前加的pre现在减两倍的pre,相当于减了一个
}
else
{
sum += readRoman(s[i]);//正常情况,直接加上
pre = readRoman(s[i]);//往后移
}
}
return sum;
}
int main()
{
char s[] = { "MCMXCIV"};
printf("%d\n", romanToInt(s));
return 0;
}