Question

Given a roman numeral, convert it to an integer.

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

Solution

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
int romanToInt(char* s) {
    int i = 0, result = 0;
    char current, next;

    do
    {
        current = s[i];

        if (s[i] == '\0')
        {
            break;
        }

        next = s[i+1];

        switch (current)
        {
            case 'I':
                if ('V' == next
                        || 'X' == next
                        || 'L' == next)
                    result -= 1;
                else
                    result += 1;
                break;
            case 'V':
                result += 5;
                break;
            case 'X':
                if ('L' == next
                        || 'C' == next
                        || 'D' == next)
                    result -= 10;
                else
                    result += 10;
                break;
            case 'L':
                result += 50;
                break;
            case 'C':
                if ('D' == next
                        || 'M' == next)
                    result -= 100;
                else
                    result += 100;
                break;
            case 'D':
                result += 500;
                break;
            case 'M':
                result += 1000;
                break;
        }

    } while(++i);

    return result;
}

Experience

有时候做题这东西很神奇,想想就出来了。

罗马数字规则

罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。 1、重复数次:一个罗马数字重复几次,就表示这个数的几倍。

2、右加左减: 2.1 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。 2.2 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。 2.3 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV 2.4 但是,左减时不可跨越一个位数。比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。(等同于阿拉伯数字每位数字分别表示。) 2.5 左减数字必须为一位,比如8写成VIII,而非IIX。 2.6 右加数字不可连续超过三位,比如14写成XIV,而非XIIII。(见下方“数码限制”一项。)

3、加线乘千: 3.1 在罗马数字的上方加上一条横线或者加上下标的Ⅿ,表示将这个数乘以1000,即是原数的1000倍。 3.2 同理,如果上方有两条横线,即是原数的1000000(1000^{2})倍。

4、数码限制: 4.1 同一数码最多只能出现三次,如40不可表示为XXXX,而要表示为XL。 4.2 例外:由于IV是古罗马神话主神朱庇特(即IVPITER,古罗马字母里没有J和U)的首字,因此有时用IIII代替Ⅳ。