羅馬數字轉整數(leetcode簡單篇第十三題)
阿新 • • 發佈:2018-11-23
羅馬數字中有這7個字元
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
I表示1,II表示2,但4表示方法為IV,5為V,7是VII,90為XL,所以有下面的幾種特殊情況:
- I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
- X 可以放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。
- C 可以放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。
所以我們在處理這個問題的時候,首先是應該給這七個字元賦予他特定數字,這裡可以使用巨集來定義。
接著我們應該判斷其中的特殊情況,特殊情況只會發生在有倆個字元時(3個字元不會出現特殊情況),所以我們判斷第一個字元和第二個字元是不是特殊情況發生時的條件。
最後就是怎麼來處理不是特殊情況時的字串,其實就是根據他的每一個字元代表的數字一直相加,直到指標指向0.所以程式碼如下。
#define nI 1//定義每一個字元代表的大小
#define nV 5
#define nX 10
#define nL 50
#define nC 100
#define nD 500
#define nM 1000
#include<stdio.h>
int romanToInt(char* s)
{
int num = 0;
int flag = 0;//這裡定義flag為一個標記,為1時我們就直接跳過了普通情況(不然沒法跳過普通情況),而為0讓他執行普通情況
while(*s != NULL)
{
if(*s == 'I' && (*(s + 1 ) == 'V' || *(s + 1) == 'X' ))
{
flag = 1;
switch(*(s + 1))
{
case'V':num += (nV - nI);s += 2;break;//讓指標直接指向0結束
case'X':num += (nX - nI);s += 2;break;
}
}
if(*s == 'X' && (*(s + 1 ) == 'L'|| *(s + 1) == 'C' ))
{
flag = 1;
switch(*(s + 1))
{
case'L':num += (nL - nX) ;s += 2;break;
case'C':num += (nC - nX);s += 2;break;
}
}
if(*s == 'C' && (*(s + 1 ) == 'D'|| *(s + 1) == 'M' ))
{
flag = 1;
switch(*(s + 1))
{
case'D':num += (nD - nC);s += 2;break;
case'M':num += (nM - nC);s += 2;break;
}
}
if(0 == flag)
{
switch(*s)
{
case'I':num += nI;s += 1;break;
case'V':num += nV;s += 1;break;
case'X':num += nX;s += 1;break;
case'L':num += nL;s += 1;break;
case'C':num += nC;s += 1;break;
case'D':num += nD;s += 1;break;
case'M':num += nM;s += 1;break;
}
}
flag = 0;//再次賦值為普通情況
}
return num;
}
int main()
{
char arr[10] = {0};
printf("請輸入一個羅馬數字\n");
scanf("%s",&arr);
romanToInt(arr);
printf("%d",romanToInt(arr));
return 0;
}