首页 > 学院 > 开发设计 > 正文

Roman to Integertegerer

2019-11-06 07:14:32
字体:
来源:转载
供稿:网友

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


上一篇:C 基础练习2

下一篇:STL中erase()小心使用

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表