Roman numerals are represented by seven different symbols: I
, V
, X
, L
, C
, D
and M
.
Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000
For example, two is written as II
in Roman numeral, just two one's added together. Twelve is written as, XII
, which is simply X
+ II
. The number twenty seven is written as XXVII
, which is XX
+ V
+ II
.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII
. Instead, the number four is written as IV
. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX
. There are six instances where subtraction is used:
I
can be placed beforeV
(5) andX
(10) to make 4 and 9.X
can be placed beforeL
(50) andC
(100) to make 40 and 90.C
can be placed beforeD
(500) andM
(1000) to make 400 and 900.
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.
Example 1:
Input: "III" Output: 3
Example 2:
Input: "IV" Output: 4
Example 3:
Input: "IX" Output: 9
Example 4:
Input: "LVIII" Output: 58 Explanation: C = 100, L = 50, XXX = 30 and III = 3.
Example 5:
Input: "MCMXCIV" Output: 1994 Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
题目翻译:
翻译罗马数字变成阿拉伯数字。罗马数字有一个特点是,从整体角度看,数据是从大到小排列的,
举个例子: DMMCVIII一定可以拆分成 DM + MC + VIII ,其中两个M是大数,将原有数据拆分成几块。
题目只需要让我们翻译罗马数字成为阿拉伯数字,但没有让我们判断是不是合格的罗马数字,这样省去了很多麻烦。
罗马数字有这样一个规律,从后往前看,如果这个数字的前边有大于等于它的数字,这个数字就一定是正的,比如III是3,VIII是8。但是如果一个数字突然小于它后边的数字,那么这个数字一定是负数,即IV就是4。以此类推,假设 IVII是正确的罗马数字,那么他的值就为 -1,+5,+1,+1,这样的加和为6。
使用map把字符都变成数字,之后定义temp存储从后向前最大的值,如果这个数字前边的比temp小,就都为负,如果前边的数字,比temp大,就为正。
#include<vector>
#include <iostream>
#include <string>
#include <cmath>
#include<map>
using namespace std;
class Solution {
public:
int romanToInt(string s)
{
int n = s.length() - 1;
int sum = 0;
int temp = 1;
map<char, int> map1;
map1.insert({ 'I',1 });
map1.insert({ 'V',5 });
map1.insert({ 'X',10 });
map1.insert({ 'L',50 });
map1.insert({ 'C',100 });
map1.insert({ 'D',500 });
map1.insert({ 'M',1000 });
//cout << map1[s[1]] << endl;
for (int i = n; i >= 0; i--)
{
if (map1[s[i]] >= temp)
{
temp = map1[s[i]];
sum += temp;
}
else
{
sum -= map1[s[i]];
}
}
return sum;
}
};
int main()
{
string s;
getline(cin, s);
Solution so;
int n = so.romanToInt(s);
cout << n << endl;
system("pause");
return 0;
}