一、题目
二、解题思路
我们遍历题目给出的字符串时,大部分情况下都是从大到小的顺序:M > D > C > L > X > V > I,但也会有一些特殊情况,所以我们须分两种情况进行讨论:
(1)字符为C、X、I 时,在不超出字符串范围的情况下,需多判断一位字符,因为它们组成CD,CM,XL,XC, IV,IX这几个特殊的字符串,是表示较小的数在表示较大的数的左边。
(2)M , D , L , V ,这几个数可以转换成相应的数字,不用做特殊处理。
注意点:刚开始我用宏定义代替数字的形式,为了后续代码修改方便和看着简洁,发现第一次运行花了12ms,初步判断是编译时宏定义需要拼接到代码中,这可能消耗一些时间,后面我去掉宏定义直接用数字的方式运行代码花了0ms,这里做一下简记,也知会一下各位读者。
三、VS-2022-测试代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRLEN 10int romanToInt(char* s);void main() {size_t i;char StrArr[][STRLEN] = {"III" ,"IV" ,"IX" ,"LVIII"};int StrArrSize = sizeof(StrArr) / (sizeof(char) * STRLEN);printf("StrArrSize : %dn", StrArrSize);for (i = 0; i < StrArrSize; i++){printf("str : %s, res : %dn", StrArr[i], romanToInt(StrArr[i]));printf("+++++++++++++++++++++n");}
}int romanToInt(char* s) {int i = 0;int res = 0;int s_size = strlen(s);while (s[i] != '