0%

integer-to-roman

半个小时写完了代码,提交之后一遍过,这种感觉还是比较爽的。

题目描述

阿拉伯数字转罗马数字,符号与对应数值如下:

1
2
3
4
5
6
7
8
Symbol       Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

需要注意的是减法的情况(4和9)

解决思路

有限的几个字母,比较好处理,先将数字减至1000以下,这个过程中只用考虑M的个数;然后就可以按照位数,循环地处理剩下的数字了。对于剩下的数字,位数上数字为4和9的需要单独处理,剩下的就是字符串循环加,数字循环减。用k来表示此时处理到的基数,k=100,10,1.最后退出循环,返回字符串。

代码

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
59
60
61
62
string intToRoman(int num) 
{
string res = "";
int remain = num;
while ((remain / 1000) > 0)
{
res += "M";
remain -= 1000;
}
int k = 100;
while (k > 0)
{
if ((remain / k) > 4)
{
if ((remain / k) == 9)
{
remain -= 9 * k;
if (k == 100)
res += "CM";
else if (k == 10)
res += "XC";
else
res += "IX";
}
else
{
remain -= 5 * k;
if (k == 100)
res += "D";
else if (k == 10)
res += "L";
else
res += "V";
}
}
if ((remain / k) == 4)
{
remain -= 4*k;
if (k == 100)
res += "CD";
else if (k == 10)
res += "XL";
else
res += "IV";
}
if ((remain / k) < 4)
{
while ((remain / k) > 0)
{
remain -= k;
if (k == 100)
res += "C";
else if (k == 10)
res += "X";
else
res += "I";
}
}
k /= 10;
}
return res;
}