string — преобразование римского онемения в стандартные числа в переполнении стека

я пытаюсь преобразовать римские числа в стандартные числа в C ++.
я сделал такие массивы: к сожалению, я не знаю, как проверить римские цифры. Потому что давайте посмотрим, что у нас есть: «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};

Есть идеи? Буду благодарен за любую помощь!

1

Решение

Вы можете использовать что-то вроде этого:

#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 и VIIII (код будет их обрабатывать), а не IV и IX.

Произошли также «двойные вычитания» (такие как IIXX вместо XVIII … код не будет обрабатывать их).

В средние века для работы с большими числами (свыше 4000) над цифрой использовался столбец (или несколько круглых скобок), чтобы указать умножение на 1000. Например.

(MM) = 2000000

Таким образом, приведенный выше код не работает для чисел> = 4000.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]