leetcode Roman to Integer羅馬數字與阿拉伯數字互轉
阿新 • • 發佈:2019-01-03
羅馬數字規則:
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
如果當前比前一個小,那麼就可以先將臨時變數的值加到結果中,然後開始下一段記錄。比如VI = 5 + 1
2.阿拉伯數字轉羅馬數字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; }
關鍵是找到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;
}