You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode罗马数字转整数C语言实现:MCMXCIV测试用例异常

罗马数字转整数代码问题排查与修复

你的代码在处理罗马数字特殊组合(如IV、IX、CM等)时逻辑完全错误,这是导致"MCMXCIV"输出3099而非1994的核心原因。

问题根源

罗马数字的特殊组合规则是:当小值符号出现在大值符号左侧时,实际值是大值减小值(比如IV=4=5-1,CM=900=1000-100)。但你的代码逻辑是先把两个符号的正常值都加上,再额外加一个数,直接导致重复计算。
比如IV的计算:你的代码先加1+5=6,再额外加3,最终得到9,完全偏离正确值4。

另外还有两个小问题:

  • if (*s == NULL)判断错误:空指针应该判断s == NULL,*s是取字符串第一个字符,和NULL(指针)比较无意义;而且返回NULL给int类型函数是错误的,应该返回0。
  • 循环中每次调用strlen(s)会重复计算字符串长度,拖慢效率,建议先把长度存到变量里。

修复后的代码

int romanToInt(char *s) {
    int sum = 0;
    // 处理空输入
    if (s == NULL || *s == '\0') {
        return 0;
    }
    int len = strlen(s);
    for (int i = 0; i < len; i++) {
        int current = 0;
        // 映射当前字符到对应数值
        switch(s[i]) {
            case 'M': current = 1000; break;
            case 'D': current = 500; break;
            case 'C': current = 100; break;
            case 'L': current = 50; break;
            case 'X': current = 10; break;
            case 'V': current = 5; break;
            case 'I': current = 1; break;
        }
        // 处理特殊组合:当前值大于前一个值,说明之前多加了一次前值,要减去两倍前值
        if (i > 0) {
            int prev = 0;
            switch(s[i-1]) {
                case 'M': prev = 1000; break;
                case 'D': prev = 500; break;
                case 'C': prev = 100; break;
                case 'L': prev = 50; break;
                case 'X': prev = 10; break;
                case 'V': prev = 5; break;
                case 'I': prev = 1; break;
            }
            if (current > prev) {
                sum += current - 2 * prev;
                continue;
            }
        }
        sum += current;
    }
    return sum;
}

更简洁的写法

可以改成先判断后累加的逻辑,提前识别特殊组合,避免重复计算前值:

int romanToInt(char *s) {
    int sum = 0;
    if (s == NULL || *s == '\0') return 0;
    int len = strlen(s);
    for (int i = 0; i < len; i++) {
        int val = 0;
        switch(s[i]) {
            case 'I': val = 1; break;
            case 'V': val = 5; break;
            case 'X': val = 10; break;
            case 'L': val = 50; break;
            case 'C': val = 100; break;
            case 'D': val = 500; break;
            case 'M': val = 1000; break;
        }
        // 如果当前值小于下一个值,就减去当前值,否则加上
        if (i < len - 1) {
            int next_val = 0;
            switch(s[i+1]) {
                case 'I': next_val = 1; break;
                case 'V': next_val = 5; break;
                case 'X': next_val = 10; break;
                case 'L': next_val = 50; break;
                case 'C': next_val = 100; break;
                case 'D': next_val = 500; break;
                case 'M': next_val = 1000; break;
            }
            if (val < next_val) {
                sum -= val;
                continue;
            }
        }
        sum += val;
    }
    return sum;
}

内容的提问来源于stack exchange,提问作者AB111122

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:17:52