c++中罗马数字到标准数字的转换
Conversion of roman numb to standard numbers in C++
我正在尝试将罗马数字转换为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的数字。 相关文章:
- 将数字转换为字母(例如:123 转换为一二三)
- 将数字转换为单词
- 使用if-else将数字转换为单词
- 将数字转换为填充字符串
- 编译时间文本到数字转换 (atoi)
- 在 c++ 中将数字转换为矢量数组的函数
- 奇怪的数字转换C++
- 用C++将浮点数字转换为本地化字符串
- 如何将ASCII数字转换为从文件中提取的整数
- 检查字符串是否是数字,然后将该数字转换为 int?
- 将 MPFR 数字转换为字符串并返回
- 如何将数字转换为整数向量?
- 如何在C++中将数字转换为链表
- 如何将字符串中的多个数字转换为整数
- 有问题将数字转换为罗马数字
- 这个给定的代码应该将给定的数字转换为尽可能滞后的数字,no.by 用 9.It 替换合适的数字是行不通的
- 将两位数字转换为低内存表示的最快方法
- 视觉 如何将混合的字母和数字转换为仅字母?C++
- 如何在 c++ 中将十六进制数字转换为字符
- 如何将字符串数字转换为各个数字的整数数组