罗马数字:
罗马数字有下面七个基本符号:I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、 M(1000)
用罗马数字表示数时:
- 如果几个相同的数字并列、就表示这个数的值是数码的几倍。 例如:罗马数字要表示 3,可以写成 Ⅲ;要表示20,可以写成 XX;
- 不相同的几个数码并列时,如果小的数码在右边,就表示数的数值是这几个数码的和。例如:6 用罗马数字可以表示为 Ⅵ;
- 如果小的数码在左边,就表示数的数值是数码之差。例如:4 用罗马数字表示为 Ⅳ;
- 正常使用时、连写的数字重复不得超过三次
- 在数字上面画一横线、表示这个数字增值 1000 倍。
IntToRoman
class Solution {
public:
string intToRoman(int num)
{
//str中把当左边小于右边的计算直接算出来了,避免我们需要判断的情况
//如IV,I < V,此处直接给出不需要计算,其他情况都是加法计算,可以不用特别标识出来
string str[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
//val数组中是和str中一一对应的
int val[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
string rt;
for(int i = 0; num > 0;i++)
{
while(num >= val[i])
{
num -= val[i];
rt.append(str[i]);
}
}
return rt;
}
};
RomanToInt
class Solution {
public:
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;
}
return 0;
}
int romanToInt(string s)
{
int rt = toNumber(s[0]);
for(int i = 1;i < s.length();i++)
{
if(toNumber(s[i-1]) < (toNumber(s[i])))
{
//若左边小于右边(对应的整数值),则右边减去左边。但是由于左边先加了一遍,所以要减去左边那个值的两倍
//此效果就等价于右边减去左边,再加到rt上
rt += toNumber(s[i]) - 2*toNumber(s[i-1]);
cout << rt << endl;
}
else
{
rt += toNumber(s[i]);
cout << rt << endl;
}
}
return rt;
}
};