[string]Roman to Integer,Integer to Roman

一.Roman to Integer

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

罗马数字是阿拉伯数字传入之前使用的一种数码。罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。记数的方法:
  1. 相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
  2. 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
  3. 小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;

    V 和 X 左边的小数字只能用Ⅰ。

    L 和 C 左边的小数字只能用X。

    D 和 M 左 边的小数字只能用C。

  4. 正常使用时,连写的数字重复不得超过三次。(表盘上的四点钟“IIII”例外)
  5. 在一个数的上面画一条横线,表示这个数扩大1000倍。
class Solution {
public:
    int romanToInt(string s) {
        // Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)
        int values[26] ={
            0,0,100,500,0,0,0,0,1,0,0,50,1000,0,0,0,0,0,0,0,0,5,0,10,0,0
        };
        int size = s.size();
        int res = 0;
        for(int i=0;i<size;i++){
            if(i+1<size){
                if(values[s[i]-'A'] >= values[s[i+1]-'A'])
                    res += values[s[i]-'A'];
                else
                    res -= values[s[i]-'A'];
            }else{
                res += values[s[i]-'A'];
            }
        }
        return res;
    }
};

 二.Integer to Roman

Total Accepted: 49661 Total Submissions: 138165 Difficulty: Medium

 

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

class Solution {
public:
    string digitToRoman(int digit,int base,string kvs[][10])
    {
        string res;
        switch(digit){
            case 9: res = kvs[base][digit];break;
            case 8: res += kvs[base][5];res += kvs[base][1];res += kvs[base][1];res += kvs[base][1];break;
            case 7: res += kvs[base][5];res += kvs[base][1];res += kvs[base][1];break;
            case 6: res += kvs[base][5];res += kvs[base][1];break;
            case 5: res = kvs[base][5];break;
            case 4: res = kvs[base][4];break;
            case 3: res += kvs[base][1];res += kvs[base][1];res += kvs[base][1];break;
            case 2: res += kvs[base][1];res += kvs[base][1];break;
            case 1: res += kvs[base][1];break;
            default: res="";
        }
        return res;
    }
    string intToRoman(int num) {
        string kvs[4][10];
        kvs[0][1] = "I"; kvs[0][4]="IV"; kvs[0][5]="V"; kvs[0][9]="IX"; 
        kvs[1][1] = "X";kvs[1][4] = "XL"; kvs[1][5]="L"; kvs[1][9]="XC"; 
        kvs[2][1] = "C"; kvs[2][4] = "CD"; kvs[2][5]="D"; kvs[2][9]="CM"; 
        kvs[3][1] = "M";
        int d = num%10;num/=10;//
        int c = num%10;num/=10;//
        int b = num%10;num/=10;//
        int a = num%10;num/=10;//
        string res =digitToRoman(a,3,kvs)+digitToRoman(b,2,kvs)+digitToRoman(c,1,kvs)+digitToRoman(d,0,kvs);
        return res;
    }
};

 

posted @ 2015-12-06 19:53  zengzy  阅读(190)  评论(0编辑  收藏  举报
levels of contents