1

我正在处理此处定义的编码 kata Roman Numerals 。虽然我已经完成并且没有被卡住,但我确实有一个问题需要帮助回答。

这是我的问题所在:

class Fixnum
  NUMERALS = [
    ['V', 5], ['IV', 4], ['I', 1]
  ]
  def to_roman
    roman = ""
    number = self
    for key, value in NUMERALS
      count, number = number.divmod(value)
      roman << (key * count)
    end
    roman
  end
end

当我对数字 5 执行 divmod 时,就像这样

5.to_roman

它返回 V。这是有道理的,因为

5.divmod(5) => 1, 0

但是上面的代码如何与

5.divmod(1) => 5, 0

那么它如何返回 V 而不是 IIIIII,因为它只是将键 (I) 与计数 (5) 相加。不知何故,它显然正确地返回了 V 而不是 IIIIII,但我不确定该逻辑在哪里。任何帮助将不胜感激。谢谢

4

1 回答 1

1

您的代码永远不会执行5.divmod(1)。它第一次执行循环时,key是 'V' 并且value是 5。然后它执行5.divmod(5),然后,number == 0. 因此,在循环的下一次迭代中,当key是 'IV' 并且value是 4 时,它会执行0.divmod(4),导致count == 0字符串中没有添加任何内容。

但是这段代码很奇怪,因为9.to_roman返回“VIV”。

于 2012-08-01T19:24:54.800 回答