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
}

总结

  1. 最后的 rem < 4 || rem > 5 时,字符串前后位置要写好
  2. num 总是在和 10 做余数判断,仅在取数值时才采用 base
  3. 代码从低位到高位,伪代码从高位到低位,很明显从低到高好一些
上一篇下一篇

猜你喜欢

热点阅读