c++中罗马数字到标准数字的转换

Conversion of roman numb to standard numbers in C++

本文关键字:数字 转换 标准 罗马 c++      更新时间:2023-10-16

我正在尝试将罗马数字转换为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};

任何想法?我将感激任何帮助!

你可以这样写:

#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'不能连续出现超过三次;
  • 'V', 'L', 'D'不能连续出现一次以上;
  • 'I'只能在'V'和'X'前面,'X'只能在'L'和'C'前面,'C'只能在'D'和'M'前面

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

"双减号"也出现了(比如IIXX而不是XVIII…代码不会处理它们)。

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

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