問題描述: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)。