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

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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值