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

罗马数字转整数程序BUG:输入'I'返回8而非1求助

问题根源分析

你的代码核心错误出在两个地方:

  • 误用多字符字符常量(比如'II'、'VIII')作为unordered_map<char, int>的键。C++里这类多字符常量会被截断为单个char,比如'VIII'最终会对应到字符'I',直接覆盖了你之前设置的m['I'] = 1,导致调用m['I']时返回的是最后一次赋值的8,这就是输入'I'返回8、'III'返回24的原因。
  • 遍历逻辑只是简单累加单个字符的值,完全没考虑罗马数字的组合规则(比如IV是5-1=4),不过当前先解决单个字符的错误。
修正方案

第一步:修正哈希表的键值对

只存储罗马数字的基础单个字符对应的值,删掉那些多字符的错误条目:

unordered_map<char, int> m;
m['I'] = 1;
m['V'] = 5;
m['X'] = 10;
// 后续可以补充其他基础字符:L=50, C=100, D=500, M=1000

第二步:处理罗马数字的组合规则

罗马数字的核心规则是:如果当前字符的值小于下一个字符的值,就减去当前值;否则加上当前值。调整遍历逻辑:

for(int i=0;i<n;i++)
{
    // 如果不是最后一个字符,且当前值小于下一个值,就减去当前值
    if(i < n-1 && m[str[i]] < m[str[i+1]])
    {
        total -= m[str[i]];
    }
    else
    {
        total += m[str[i]];
    }
}

完整修正后的代码

#include <bits/stdc++.h>
using namespace std;
  
int romantoint(char str[],int &n)
{
    int total=0;
    unordered_map<char,int> m;
    m['I'] = 1;
    m['V'] = 5;
    m['X'] = 10;
    m['L'] = 50;
    m['C'] = 100;
    m['D'] = 500;
    m['M'] = 1000;

    for(int i=0;i<n;i++)
    {
        if(i < n-1 && m[str[i]] < m[str[i+1]])
        {
            total -= m[str[i]];
        }
        else
        {
            total += m[str[i]];
        }
    }

    return total;
    
}

int main()
{
    char str[] = "I";
    int n = strlen(str);
    cout<<romantoint(str,n); // 现在会正确输出1
}
测试验证
  • 输入"I":返回1,符合预期
  • 输入"III":返回3,符合预期
  • 输入"IV":返回4,符合组合规则
  • 输入"VIII":返回8,符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:35:10