1. 程式人生 > >leetcode Roman to Integer羅馬數字與阿拉伯數字互轉

leetcode Roman to Integer羅馬數字與阿拉伯數字互轉

羅馬數字規則:
1, 羅馬數字共有7個,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。
羅馬數字中沒有“0”。
2, 重複次數:一個羅馬數字最多重複3次。
3, 右加左減:
在較大的羅馬數字的右邊記上較小的羅馬數字,表示大數字加小數字。
在較大的羅馬數字的左邊記上較小的羅馬數字,表示大數字減小數字。
4, 左減的數字有限制,僅限於I、X、C,且放在大數的左邊只能用一個。
(*) V 和 X 左邊的小數字只能用Ⅰ。
(*) L 和 C 左邊的小數字只能用X。
(*) D 和 M 左 邊的小數字只能用C。

1.羅馬數字轉阿拉伯數字:

如果當前處理的字元對應的值和上一個字元一樣,那麼臨時變數加上這個字元。比如III = 3

如果當前比前一個大,說明這一段的值應該是當前這個值減去前面記錄下的臨時變數中的值。比如IIV = 5 – 2

如果當前比前一個小,那麼就可以先將臨時變數的值加到結果中,然後開始下一段記錄。比如VI = 5 + 1

int getnum(char c){
	switch (c){
	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:return 0;}
}
int romanToInt(char* s) {
	int l=strlen(s);
	if(l==0)return 0;
	int sum=getnum(s[l-1]);
	for(int i=l-1;i>=0;i--){
		if(getnum(s[i-1])>=getnum(s[i])){sum+=getnum(s[i-1]);}
		else sum-=getnum(s[i-1]);
	}
	return sum;
}
2.阿拉伯數字轉羅馬數字
關鍵是找到1-3999之間羅馬數字的基本符號:例如在1-20之內I , II , III ,IV ,V ,VI ,VII ,VIII ,IX ,X ,XI ,XII ,XIII,XIV,XV,XVI,XVII,XVIII,XIX,XX,基本符號是I,V,X,其他數字都是在此基礎上的組合,通過查閱資料找到1-3999之間基本符號:

"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"

對應:

1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1

接下來就簡單了,直接判斷阿拉伯數字與各基本符號數字的大小即可:

char* intToRoman(int num) {
    int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; 
	char chara[13][3]={"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; 
	char *p=(char*)malloc(sizeof(char)*15);
	memset(p,0,sizeof(p));
	int i;
	int j=0;
	for(i=0;i<13;i++){
		while(num>=values[i])
		{for(int k=0;chara[i][k]!='\0';k++)p[j++]=chara[i][k];
		num-=values[i];
		}
	}
	p[j]='\0';
	return p;
}