題目描述
羅馬數(shù)字包含以下七種字符: I, V, X, L,C,D 和 M。
字符 數(shù)值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 羅馬數(shù)字 2 寫做 II ,即為兩個(gè)并列的 1。12 寫做 XII ,即為 X + II 。 27 寫做 XXVII, 即為 XX + V + II 。
通常情況下,羅馬數(shù)字中小的數(shù)字在大的數(shù)字的右邊。但也存在特例,例如 4 不寫做 IIII,而是 IV。數(shù)字 1 在數(shù)字 5 的左邊,所表示的數(shù)等于大數(shù) 5 減小數(shù) 1 得到的數(shù)值 4 。同樣地,數(shù)字 9 表示為 IX。這個(gè)特殊的規(guī)則只適用于以下六種情況:
I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。
給定一個(gè)羅馬數(shù)字,將其轉(zhuǎn)換成整數(shù)。輸入確保在 1 到 3999 的范圍內(nèi)。
示例
輸入: "III"
輸出: 3
答題模板
int romanToInt(char* s)
{
}
分析
由答題模式發(fā)現(xiàn)是讓我們書寫子函數(shù),該子函數(shù)的形參是字符型指針變量s,咋一看可能覺得不太理解,關(guān)于指針可以看第一節(jié)編程小白~leetcode簡(jiǎn)單級(jí)。其實(shí)這個(gè)形參很簡(jiǎn)單只是表示字符串s而已,明白這一點(diǎn),應(yīng)該就會(huì)好做了。其次如果看到這種題感覺復(fù)雜的話,可以先實(shí)現(xiàn)一位字符,然后再實(shí)現(xiàn)二位字符再依次累加才能不斷增進(jìn)編程的興趣和實(shí)現(xiàn)一步一步慢慢來的習(xí)慣,所謂不會(huì)走就想跑是辦不到的。所以最開始著手能夠?qū)崿F(xiàn)的再慢慢增加難度,加上堅(jiān)持和信念相信一定可以的。
完整代碼
#include<stdio.h>
#include<string.h>
int romanToInt(char* s)
{
int len,i,j,sum;
len = strlen(s);
sum=0;
for(i=0;i<len;i++)
{
if(s[i]=='I')
{
if(s[i+1]=='V')
{
sum+=4;
i = i+1;
}
else if(s[i+1]=='X')
{
sum+=9;
i = i+1;
}
else
sum+=1;
}
else if(s[i]=='I')
sum+=1;
else if(s[i]=='V')
sum+=5;
else if(s[i]=='X')
{
if(s[i+1]=='L')
{
sum+=40;
i=i+1;
}
else if(s[i+1]=='C')
{
sum+=90;
i = i+1;
}
else
sum+=10;
}
else if(s[i]=='L')
sum+=50;
else if(s[i]=='C')
{
if(s[i+1]=='D')
{
sum+=400;
i+=1;
}
else if(s[i+1]=='M')
{
sum+=900;
i+=1;
}
else
sum+=100;
}
else if(s[i]=='D')
sum+=500;
else if(s[i]=='M')
sum+=1000;
// printf("%d,%d,%c\n",sum,i,s[i]);
}
//printf("%d\n",len);
return sum;
}
int main()
{
int i,j,m;
char str[10];
gets(str);
m = romanToInt(str);
printf("%d\n",m);
}
目前只會(huì)最簡(jiǎn)單的做法,等未來見識(shí)更多的方法再來補(bǔ)充更好的方式去解決這個(gè)問題。