4.Roman to integer(integer to roman罗马数和整型数的相互转换)

时间:2022-01-13 09:50:22

4.Roman to integer(integer to roman罗马数和整型数的相互转换)

(1)Roman to integer

链接:http://www.lintcode.com/zh-cn/problem/roman-to-integer/

罗马数转整型数。

//计数规则:

/*1. 若干相同数字连写表示的数是这些罗马数字的和,如 III=3;

2. 小数字在大数字前面表示的数是用大数字减去小数字,如 IV=4;

3. 小数字在大数字后面表示的数是用大数字加上小数字,如 VI=6;

 

其中每两个阶段的之间有一个减法的表示,比如 900=CM,C 写在 M 前面表示 M-C。

*/

根据以上规则,较容易写出代码。

class Solution {
public:
/**
* @param s Roman representation
* @return an integer
*/
int romanToInt(string& s) {
// Write your code here
if(s.empty())
return 0;
int len=s.size();
int ans=helper(s[0]);
for(int i=1;i<len;++i)
{
ans+=helper(s[i]);
if(helper(s[i-1])<helper(s[i]))
ans-=2*helper(s[i-1]);
}
return ans;
}
int helper(char c)
{
switch(c)
{
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;
}
};


 

(2)integer to roman

链接:http://www.lintcode.com/zh-cn/problem/integer-to-roman/

整型数转罗马数

转化规则同上。代码更简单,直接写两个table,把Roman和integer 基本的值对应起来。如下:

        string Roman[] = {"M","CM", "D", "CD", "C", "XC","L", "XL", "X", "IX", "V","IV", "I"};

        int value[] = {1000, 900, 500, 400,100, 90, 50, 40, 10, 9, 5, 4, 1};

 

代码如下:

class Solution {
public:
/**
* @param n The integer
* @return Roman representation
*/
string intToRoman(int n) {
// Write your code here
string str;
string Roman[] = {"M","CM", "D", "CD", "C", "XC","L", "XL", "X", "IX", "V","IV", "I"};
int value[] = {1000, 900, 500, 400,100, 90, 50, 40, 10, 9, 5, 4, 1};
for(int i=0;i<13;++i)
{
while(n>=value[i])
{
n-=value[i];
str+=Roman[i];
}
}
return str;
}
};