在使用带有罗马字符“I”的字符串时,它给出 8 而不是 1。类似地,对于“III”,给出 24 而不是 3

Aks*_*ant -3 c++ c++11 c++17

包括像“IV”这样的字符串的其余部分尚未完成,但现在的问题是对于“I”,程序返回 8 而不是 1;

#include <bits/stdc++.h> //header file
using namespace std;
  
int romantoint(char str[],int &n)
{
    int total=0;
    unordered_map <char,int> m;
    m['I'] = 1;
    m['II'] = 2;
    m['III'] = 3;
    m['IV'] = 4;
    m['V'] = 5;
    m['VI'] = 6;
    m['VII'] = 7;
    m['VIII'] = 8;
    m['IX'] = 9;
    m['X'] = 10;

    for(int i=0;i<n;i++)
    {
      total = total+m[str[i]];
    }

    return total;
    
}




int main()
{
  char str[] = "I";
  int n = strlen(str);
  cout<<romantoint(str,n);
}
Run Code Online (Sandbox Code Playgroud)

Deb*_*Deb 5

 unordered_map <char,int> m;
Run Code Online (Sandbox Code Playgroud)

这一行告诉编译器您要将一个字符映射到一个整数。然而,当您初始化映射时,您已将“VIII”的字符串值映射到 8。由于键必须是一个字符,因此在映射时实际上会覆盖映射。这就是当您尝试查找映射到的值时得到 8 的原因,因为键不应超过单个字符。m['I']= 1m['VIII']=8m['I']

PS 这看起来像一个函数,您希望从中返回相应的整数值,并接受其等效的罗马数字。
我建议使用相同的 unordered_map <char,int> m;映射,但不要直接将 VIII 映射到 8,而是使用V (=5)I (=1)的映射来使用程序逻辑计算出 VIII 的值;)