题目源自于leetcode。
题目:将一个int型的阿拉伯数字转换为string型的罗马数字。
方法:首先要知道罗马数字的表示法。
个位、十位、百位、千位都是特点的字幕作为权值,每一个位的10个数字的表示方法也类似,都会在5有另一个中间的字母。
M=1000 |
D = 500 | |||||||||
I |
1 |
XXXII |
32 |
LXIII |
63 |
XCIV |
94 | |||
II |
2 |
XXXIII |
33 |
LXIV |
64 |
XCV |
95 | |||
III |
3 |
XXXIV |
34 |
LXV |
65 |
XCVI |
96 | |||
IV |
4 |
XXXV |
35 |
LXVI |
66 |
XCVII |
97 | |||
V |
5 |
XXXVI |
36 |
LXVII |
67 |
XCVIII |
98 | |||
VI |
6 |
XXXVII |
37 |
LXVIII |
68 |
XCIX |
99 | |||
VII |
7 |
XXXVIII |
38 |
LXIX |
69 |
C |
100 | |||
VIII |
8 |
XXXIX |
39 |
LXX |
70 | |||||
IX |
9 |
XL |
40 |
LXXI |
71 |
EX. | ||||
X |
10 |
XLI |
41 |
LXXII |
72 |
DI |
501 | |||
XI |
11 |
XLII |
42 |
LXXIII |
73 |
DL |
550 | |||
XII |
12 |
XLIII |
43 |
LXXIV |
74 |
DXXX |
530 | |||
XIII |
13 |
XLIV |
44 |
LXXV |
75 |
DCCVII |
707 | |||
XIV |
14 |
XLV |
45 |
LXXVI |
76 |
DCCCXC |
890 | |||
XV |
15 |
XLVI |
46 |
LXXVII |
77 |
MD |
1500 | |||
XVI |
16 |
XLVII |
47 |
LXXVIII |
78 |
MDCCC |
1800 | |||
XVII |
17 |
XLVIII |
48 |
LXXIX |
79 |
CM |
900 | |||
XVIII |
18 |
XLIX |
49 |
LXXX |
80 | |||||
XIX |
19 |
L |
50 |
LXXXI |
81 | |||||
XX |
20 |
LI |
51 |
LXXXII |
82 | |||||
XXI |
21 |
LII |
52 |
LXXXIII |
83 | |||||
XXII |
22 |
LIII |
53 |
LXXXIV |
84 | |||||
XXIII |
23 |
LIV |
54 |
LXXXV |
85 | |||||
XXIV |
24 |
LV |
55 |
LXXXVI |
86 | |||||
XXV |
25 |
LVI |
56 |
LXXXVII |
87 | |||||
XXVI |
26 |
LVII |
57 |
LXXXVIII |
88 | |||||
XXVII |
27 |
LVIII |
58 |
LXXXIX |
89 | |||||
XXVIII |
28 |
LIX |
59 |
XC |
90 | |||||
XXIX |
29 |
LX |
60 |
XCI |
91 | |||||
XXX |
30 |
LXI |
61 |
XCII |
92 | |||||
XXXI |
31 |
LXII |
62 |
XCIII |
93 | |
既然各个位的表示方法固定,并且位与位之间并不影响,所以用数组将他们罗列出来。转换是从低位到高位。
string cost[][10] = {{"","I","II","III","IV","V","VI","VII","VIII","IX"},
{"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
{"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
{"","M","MM","MMM",""}};
代码:
class Solution {
public:
string intToRoman(int num) {
string cost[][10] = {{"","I","II","III","IV","V","VI","VII","VIII","IX"},
{"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
{"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
{"","M","MM","MMM",""}};
int n;
int idx = 0;
string roman = "", tmp = "";
while(num!=0)
{
n = num%10;
num /= 10;
tmp = cost[idx][n];
roman = tmp + roman;
idx++;
}
return roman;
}
};
注意:借助二维数组来对应不同位的不同权值字母。