я пытаюсь преобразовать римские числа в стандартные числа в 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};
Есть идеи? Буду благодарен за любую помощь!
Вы можете использовать что-то вроде этого:
#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;
}
Вы должны добавить проверку входных данных (пустая строка, неверные символы …).
Также, если вам нужна стандартная форма, отражающая типичное «современное» использование:
Римляне были немного непоследовательны … они предпочитали аддитивные формы, такие как IIII и VIIII (код будет их обрабатывать), а не IV и IX.
Произошли также «двойные вычитания» (такие как IIXX вместо XVIII … код не будет обрабатывать их).
В средние века для работы с большими числами (свыше 4000) над цифрой использовался столбец (или несколько круглых скобок), чтобы указать умножение на 1000. Например.
(MM) = 2000000
Таким образом, приведенный выше код не работает для чисел> = 4000.
Других решений пока нет …