13 罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
示例 1:
输入: s = "III"
输出: 3
示例 2:
输入: s = "IV"
输出: 4
示例 3:
输入: s = "IX"
输出: 9
示例 4:
输入: s = "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输入: s = "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
1 <= s.length <= 15
方法一
普通字符直接加
其他字符:判断下一位,判断是否构成减法的情况
是,做减法
不是,做加法
int romanToInt(char * s){
int i,len=strlen(s),sum=0;
for(i=0;i<len;i++){
if(s[i]=='M')sum+=1000;
else if(s[i]=='D')sum+=500;
else if(s[i]=='L')sum+=50;
else if(s[i]=='V')sum+=5;
else if(s[i]=='C'){
if(s[i+1]=='D'||s[i+1]=='M')sum-=100;
else sum+=100;
}
else if(s[i]=='X'){
if(s[i+1]=='L'||s[i+1]=='C')sum-=10;
else sum+=10;
}
else{
if(s[i+1]=='V'||s[i+1]=='X')sum-=1;
else sum+=1;
}
}
return sum;
}
方法二
罗马字符转化为对应数字,利用start指针比较相邻两位数的大小
该数比后面的数大,直接加后面的数,指针右移
该数比后面的数小,加后面的数再减去两倍前面的数
如IV 对应1 5 sum=1
1<5 sum=sum+5-2*1=4
int Convert(char a){
int t;
if(a=='I')t=1;
else if(a=='V')t=5;
else if(a=='X')t=10;
else if(a=='L')t=50;
else if(a=='C')t=100;
else if(a=='D')t=500;
else t=1000;
return t;
}
int romanToInt(char * s){
int i,len=strlen(s);
int a[20]={};
for(i=0;i<len;i++){
a[i]=Convert(s[i]);
}
int start=0,sum=a[0];
for(i=1;i<len;i++){
if(a[start]>=a[i]) sum+=a[i];
else sum=sum+a[i]-2*a[start];
start++;
}
return sum;
}
12 整数转罗马数字
七个不同的符号代表罗马数字,其值如下:
符号 值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (V) 减 1 (I): IV ,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。
只有 10 的次方(I, X, C, M)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要将符号附加4次,请使用 减法形式。
给定一个整数,将其转换为罗马数字。
示例 1:
输入:num = 3749
输出: "MMMDCCXLIX"
解释:
3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
700 = DCC 由于 500 (D) + 100 (C) + 100 (C)
40 = XL 由于 50 (L) 减 10 (X)
9 = IX 由于 10 (X) 减 1 (I)
注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位
示例 2:
输入:num = 58
输出:"LVIII"
解释:
50 = L
8 = VIII
示例 3:
输入:num = 1994
输出:"MCMXCIV"
解释:
1000 = M
900 = CM
90 = XC
4 = IV
提示:
1 <= num <= 3999
解题思路:
分离整数每一位,对每一位进行分析,如1994
千位 1 对应M
百位 9 对应CM
十位 9 对应 XC
个位 4 对应IV
利用二维数组和strcpy函数,注意strcpy从字符串结尾开始拷贝,所以a[0]='\n'
从0开始拷贝,头文件为string.h
const char* thousands[]={"","M","MM","MMM"};
const char* hundreds[]={"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
const char* tens[]={"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
const char* ones[]={"","I","II","III","IV","V","VI","VII","VIII","IX"};
char* intToRoman(int num) {
char* a=malloc(sizeof(char)* 16);
a[0]='\0';//要让第一个元素为空值
int q=num/1000,b=num%1000/100,s=num%100/10,g=num%10;
strcpy(a+strlen(a),thousands[q]);
strcpy(a+strlen(a),hundreds[b]);
strcpy(a+strlen(a),tens[s]);
strcpy(a+strlen(a),ones[g]);
return a;
}