1

我正在尝试将罗马数字转换为 C++ 中的标准数字。我做了这样的数组:不幸的是我不知道如何检查罗马数字。因为让我们的 s 是:“MCLXIV”所以当我将通过它时,我将比较字符和“CM”或“IX”例如是字符串。

这是我的数组的声明

 string rzym[13] = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
 int arab[13] = {1,4,5,9,10,40,50,90,100,400,500,900,1000};

有任何想法吗?如果有任何帮助,我将不胜感激!

4

1 回答 1

0

你可以使用这样的东西:

#include <iostream>
#include <map>
#include <string>

int from_roman(const std::string &roman)
{
  std::map<char, int> map =
  {
    {'M', 1000}, {'D', 500}, {'C', 100},
    {'L',   50}, {'X',  10}, {'V',   5},
    {'I',    1}
  };

  int n(0);
  const unsigned stop(roman.length() - 1);

  for (unsigned i(0); i < stop; ++i)
    if (map[roman[i]] >= map[roman[i + 1]])
      n += map[roman[i]];
    else
      n -= map[roman[i]];

  n += map[roman[stop]];

  return n;
}

int main()
{
  std::cout << "XIII = " << from_roman("XIII") << std::endl
            << "XIV = " << from_roman("XIV") << std::endl
            << "MCXLIV = " << from_roman("MCXLIV") << std::endl;;

  return 0;
}

您应该添加输入数据验证(空字符串、无效字符...)。

此外,如果您需要反映典型“现代”用法的标准表格:

  • 'I', 'X', 'C' 不能连续出现超过 3 次;
  • 'V', 'L', 'D' 不能连续出现超过一次;
  • 'I'只能在'V'和'X'之前,'X'只能在'L'和'C'之前,'C'只能在'D'和'M'之前。

罗马人有点不一致......他们更喜欢添加形式,如 IIII 和 VIII(代码将处理它们)而不是 IV 和 IX。

“双减法”也发生了(例如 IIXX 而不是 XVIII ......代码不会处理它们)。

在中世纪,为了处理大数字(4000 以上),在数字上方使用一个条(或在其周围放置一对括号),以表示乘以 1000。例如

(MM) = 2000000

所以上面的代码不适用于 >= 4000 的数字。

于 2014-03-23T10:45:07.573 回答