剩余 - 我的代码不正确,但为什么它有效?

Jok*_*oko 2 ruby

昨天我完成了Chris Pine的"学习计划"一书中的练习(9.5).它是Old-school Roman数字转换器的整数.

我就这样做了:

def old_roman_numeral number
    roman_number = ""
    while number != 0
        if number % 1000 == 0
            number -= 1000
            roman_number += "M"
            next
        elsif number % 500 == 0
            number -= 500
            roman_number += "D"
            next
        elsif number % 100 == 0
            number -= 100
            roman_number += "C"
            next
        elsif number % 50 == 0
            number -= 50
            roman_number += "L"
            next
        elsif number % 10 == 0
            number -= 10
            roman_number += "X"
            next
        elsif number % 5 == 0
            number -= 5
            roman_number += "V"
            next
        else
            number -= 1
            roman_number += "I"
        end
    end
    roman_number.reverse
end

puts "Please enter any number and I convert it to"
puts "Old-school Roman numerals."
puts
num = gets.chomp.to_i
puts "Your number #{num} converted to Old-school Roman is:"
puts (old_roman_numeral num)
Run Code Online (Sandbox Code Playgroud)

当我运行脚本时,它输出正确的罗马数字.

例如1200 => MCC

但是,当我今天醒来时,我想到的第一件事就是,这不可能是正确的!剩下的1200%1000是200而不是0!但为什么输出MCC而不是CCCCCCCCCCCC?

lc.*_*lc. 7

如果你追踪程序,它实际上匹配% 100 == 0两次,获得CC,并留下你1000.然后它匹配% 1000 == 0,离开CCM.最后它反转了弦,让你离开MCC.


旁注:对问题有趣的方法,因为我可能会使用一系列>=比较以正向顺序构建字符串,其中包含"减法"部分(IVIX)的特殊情况.虽然在第二次阅读时,这个解决方案似乎输出IIII而不是IV,所以特殊情况没有实际意义.