1. 程式人生 > >LeetCode OJ 之 Roman to Integer(羅馬數字轉十進位制)

LeetCode OJ 之 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到3999之內)

羅馬數字計數方法:

基本字元 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. 正常使用時,連寫的數字重複不得超過三次。(錶盤上的四點鐘“IIII”例外)
  5. 在一個數的上面畫一條橫線,表示這個數擴大1000倍。
舉例:
  • 個位數舉例 Ⅰ,1 】Ⅱ,2】 Ⅲ,3】 Ⅳ,4 】Ⅴ,5 】Ⅵ,6】Ⅶ,7】 Ⅷ,8 】Ⅸ,9 】
  • 十位數舉例 Ⅹ,10】 Ⅺ,11 】Ⅻ,12】 XIII,13】 XIV,14】 XV,15 】XVI,16 】XVII,17 】XVIII,18】 XIX,19】 XX,20】 XXI,21 】XXII,22 】XXIX,29】 XXX,30】 XXXIV,34】 XXXV,35 】XXXIX,39】 XL,40】 L,50 】LI,51】 LV,55】 LX,60】 LXV,65】 LXXX,80】 XC,90 】XCIII,93】 XCV,95 】XCVIII,98】 XCIX,99 】
  • 百位數舉例 C,100】 CC,200 】CCC,300 】CD,400】 D,500 】DC,600 】DCC,700】 DCCC,800 】CM,900】 CMXCIX,999】
  • 千位數舉例 M,1000】 MC,1100 】MCD,1400 】MD,1500 】MDC,1600 】MDCLXVI,1666】 MDCCCLXXXVIII,1888 】MDCCCXCIX,1899 】MCM,1900 】MCMLXXVI,1976】 MCMLXXXIV,1984】 MCMXC,1990 】MM,2000 】MMMCMXCIX,3999】
#include<iostream>
using namespace std;

//行內函數,用於把字元轉化成對應的數字
inline int map(char a)
{
	switch(a)
	{
		case 'I':
			return 1;
		case 'V':
			return 5;
		case 'X':
			return 10;
		case 'L':
			return 50;
		case 'C':
			return 100;
		case 'D':
			return 500;
		case 'M':
			return 1000;
		default:
			break;
	}
	return 0;
}

int romanToInt(string s)
{
	int result=0;//返回結果
	//比較當前字元與前一個字元,如果較小,則直接加上對應的數,如果較大,則加上對應的數並且減去2倍的前一個數
	for(size_t i = 0;i < s.size();i++)
	{
		if(i>0 && map(s[i]) > map(s[i-1]))
			result += map(s[i])- 2 * map(s[i-1]);
		else
			result += map(s[i]);
	}
	return result;
}
int main()
{
	string s="MCMLXXXIV";//1984
	cout<<romanToInt(s)<<endl;
}