问题描述:Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
首先我们需要对罗马数字有一个基本的了解,大家都知道罗马数字1到9分别
I,1
II,2
III,3
IV,4
V,5
VI,6
VII,7
VIII,8
IX,9
但是后面的罗马数字就不一定是每个人都知道的了,为了方便大家理解这个问题,我先介绍一下罗马数字的组成。
基本字符:
I、V、X、L、C、D、M
相应的阿拉伯数字表示为:
1.5、10、50、100、500、1000
(1)相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
(2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
(3)小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
(4)正常使用时连写的数字重复不得超过三次。
(5)在一个数的上面画一条横线,表示这个数增值1000 倍。
好了,那么DCXXI是多少?
500+100+10+10+1=621
对于这个问题而言,我的思路是:
- 后面的数字比前面小则直接加到前面的数字上去。
- 后面的数字比前面大则加到前面数字上后再减去两倍的前面数字。
代码部分:
#include<iostream>
#include<string>
using namespace std;
int graph[100];
int main()
{
graph['I'] = 1;
graph['V'] = 5;
graph['X'] = 10;
graph['L'] = 50;
graph['C'] = 100;
graph['D'] = 500;
graph['M'] = 1000;
string num;
cin>>num;
int res = graph[num[0]];
for(int i=0; num[i] != 0; i++)
{
if(graph[num[i]] >= graph[num[i+1]])
{
res+=graph[num[i+1]];
}else
{
res = res + graph[num[i+1]] - 2*graph[num[i]];
}
}
cout<<res;
}
因为只有对字符串遍历一次,所以该算法的复杂度是
O(n)。