罗马数字转整数程序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
相关产品推荐
相关产品推荐

