Roman to Integertegerer

問題描述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)。
發佈了21 篇原創文章 · 獲贊 0 · 訪問量 2437
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章