12. Integer to Roman 整数转罗马数字
2022-03-14 本文已影响0人
sarto
题目
罗马数字由 7 个不同的符号表示
解析
罗马数字也是一种 10 进制的表示方法,只是有一些特殊处理。将整数转换为罗马数字,主要是对每个 10 进制位找到其正确的编码方法。
伪码
map[int]string = {1:I ... 1000:M}
base = 1000
rst=""
for x != 0 {
quo = x / base
switch quo
case =4
case =5
case =9
case <4
case >5
x = x %base
}
代码
func intToRoman(num int) string {
m := map[int]string{
1:"I",
5:"V",
10:"X",
50:"L",
100:"C",
500:"D",
1000:"M",
}
var s string
base := 1
for ;num != 0; {
rem := num % 10
switch{
case rem == 4:
s = m[base] + m[5*base] + s
case rem == 5:
s = m[5*base] + s
case rem == 9:
s = m[base] + m[10*base] + s
case rem < 4 || rem > 5:
var ts string
if rem > 5 {
ts = m[5*base]
rem = rem - 5
}
for i:=0; i<rem; i++ {
ts += m[base]
}
s = ts + s
}
num = num / 10
base = base*10
}
return s
}
总结
- 最后的 rem < 4 || rem > 5 时,字符串前后位置要写好
- num 总是在和 10 做余数判断,仅在取数值时才采用 base
- 代码从低位到高位,伪代码从高位到低位,很明显从低到高好一些