昨天我完成了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?
如果你追踪程序,它实际上匹配% 100 == 0两次,获得CC,并留下你1000.然后它匹配% 1000 == 0,离开CCM.最后它反转了弦,让你离开MCC.
旁注:对问题有趣的方法,因为我可能会使用一系列>=比较以正向顺序构建字符串,其中包含"减法"部分(IV或IX)的特殊情况.虽然在第二次阅读时,这个解决方案似乎输出IIII而不是IV,所以特殊情况没有实际意义.