c++ - 在 C++ 中将罗马数字转换为标准数字

标签 c++ string char comparison roman-numerals

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

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

此外,如果您需要反射(reflect)典型“现代”用法的标准形式:

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

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

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

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

(MM) = 2000000

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

关于c++ - 在 C++ 中将罗马数字转换为标准数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22589121/

相关文章:

c++ - 带有 char 值的 if 语句

c++ - 遍历通用节点类,列出所有节点导致无限循环

c++ - 如何将 v8::FunctionCallbackInfo<v8::Value> 数组从一个隔离区复制到另一个隔离区?

java - 如何使用字符串作为参数来表示 Java 中的对象?

c++ - 我被字符串和数组困住了

c - 试图从 C 中的字符串中删除所有数字

C++:如何用拆分查找单词?正则表达式

c++ - 使用 FindFirstFile 和 FindNextFile C++ 进行递归硬盘搜索

javascript - 为什么在 javascript 中使用辅助函数构建字符串?

java - 有没有办法将 java 中的字符串或字符字段转换为数学运算符?