问题描述: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)。
新闻热点
疑难解答