Leetcode c语言-Roman to Integer
Title:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
这道题和上道题相反,将罗马数字转换成数字。
两种解法:
第一种,穷举法,列举出所有可能。
这是所有罗马数字的整数,从1-3999. 任意一个数字都可以由下列进行组合得到。
{
""
,
"I"
,
"II"
,
"III"
,
"IV"
,
"V"
,
"VI"
,
"VII"
,
"VIII"
,
"IX"
},
{
""
,
"X"
,
"XX"
,
"XXX"
,
"XL"
,
"L"
,
"LX"
,
"LXX"
,
"LXXX"
,
"XC"
},
{
""
,
"C"
,
"CC"
,
"CCC"
,
"CD"
,
"D"
,
"DC"
,
"DCC"
,
"DCCC"
,
"CM"
},
{
""
,
"M"
,
"MM"
,
"MMM"
}
int romanToInt(char* s) {
int result;
int i=0;
int a = 0;
int b=0;
int c=0;
int d=0;
while (s[i]) {
if (s[i] == 'M') {
if (i>=1 && s[i-1]=='C')
b=900;
else
a=a+1000;
}
else if (s[i] == 'C') {
if (i>=1 && s[i-1]=='X')
c=90;
else if (s[i+1]=='D')
b=400;
else if (i>=1 && s[i-1]=='D')
b=600;
else if (i>=2 && s[i-1]=='C' && s[i-2]=='D')
b=700;
else if (i>=3 && s[i-1]=='C' && s[i-2]=='C' && s[i-3]=='D')
b=800;
else if (i>=0 && s[i+1]!='M')
b=b+100;
}
else if (s[i] == 'D') {
if (s[i-1]!='C' && s[i+1]!='C')
b=500;
}
else if (s[i] == 'X') {
if (s[i+1] == 'L')
c=40;
else if (i>=1 && s[i-1]=='L')
c=60;
else if (i>=2 && s[i-1]=='X' && s[i-2]=='L')
c=70;
else if (i>=3 && s[i-1]=='X' && s[i-2]=='X' && s[i-3]=='L')
c=80;
else if (i>=1 && s[i-1]=='I')
d=9;
else if (i>=0 && s[i+1]!='C'){
c=c+10;
}
}
else if (s[i] == 'L') {
if (i>=1 && s[i-1]!='X' && s[i+1]!='X')
c=50;
else if (i<1 && s[i+1]!='X')
c=50;
}
else if (s[i] == 'I') {
if (s[i+1] == 'V')
d=4;
else if (i>=1 && s[i-1]=='V')
d=6;
else if (i>=2 && s[i-1]=='I' && s[i-2]=='V')
d=7;
else if (i>=3 && s[i-1]=='I' && s[i-2]=='I' && s[i-3]=='V')
d=8;
else if (i>=0 && s[i+1]!='X')
d=d+1;
}
else if (s[i] == 'V') {
if (s[i-1]!='I' && s[i+1]!='I')
d=5;
}
i++;
}
result = a+b+c+d;
return result;
}
第二种解法,掌握罗马数字书写的规律:
-
相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
-
小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
-
小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
-
正常使用时、连写的数字重复不得超过三次;
基本字符 |
I
|
V
|
X
|
L
|
C
|
D
|
M
|
---|---|---|---|---|---|---|---|
相应的阿拉伯数字表示为 |
1
|
5
|
10
|
50
|
100
|
500
|
1000
|
比如XCIX,首先判断XC,X小于C,因此是相减C-X=90,然后跳两位再进行判断,IX,10-1=9,所以XCIX表示99。
Solutions:
int toNumber(char ch) {
switch (ch) {
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 total=0;
char *p=s;
int i=0;
int a=0;
int b=0;
while(p[i]!='\0')
{
a=toNumber(p[i]);
b=toNumber(p[i+1]);
if(a>=b)
{
total=a+total;
i=i+1;
}
if(a<b)
{
total=total+b-a;
i=i+2;
}
}
return total;
}
posted on 2017-09-11 22:18 sichenzhao 阅读(117) 评论(0) 编辑 收藏 举报