Roman to Integertegerer

来源:互联网 发布:网络空间安全研究生 编辑:程序博客网 时间:2024/05/03 03:17

问题描述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

但是后面的罗马数字就不一定是每个人都知道的了,为了方便大家理解这个问题,我先介绍一下罗马数字的组成。

基本字符:

  IVXLCDM

  相应的阿拉伯数字表示为:

  1510501005001000

  (1)相同的数字连写,所表示的数等于这些数字相加得到的数,如: = 3

  (2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如: = 8 = 12

  (3)小的数字,(限于X C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:= 4= 9

  (4)正常使用时连写的数字重复不得超过三次。

  (5)在一个数的上面画一条横线,表示这个数增值1000 倍。

好了,那么DCXXI是多少?


500+100+10+10+1=621


对于这个问题而言,我的思路是:

  1. 后面的数字比前面小则直接加到前面的数字上去。
  2. 后面的数字比前面大则加到前面数字上后再减去两倍的前面数字。

代码部分:

#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)。


0 0