在学习编程(第 2 版)中有一个练习可以找到给定日期之间的闰年
编写一个程序,询问开始年份和结束年份,然后将所有闰年放在它们之间(如果它们也是闰年,则包括它们)。闰年是能被 4 整除的年份(如 1984 年和 2004 年)。但是,能被 100 整除的年份不是闰年(例如 1800 和 1900),除非它们也能被 400 整除(例如 1600 和 2000,它们实际上是闰年)。真是一团糟!
我做了一些挖掘,找到了“答案的关键”。根据key,正确的代码如下:
puts 'Input a starting year:'
start_year = gets.chomp
puts 'Input an ending year:'
end_year = gets.chomp
puts ''
while start_year.to_i <= end_year.to_i
if start_year.to_f % 400 == 0
puts start_year
elsif start_year.to_f % 100 == 0
elsif start_year.to_f % 4 == 0
puts start_year
end
start_year = start_year.to_i + 1
end
我想知道为什么start_year
需要将其更改为浮动,以及为什么elsif
在一行中有两个语句 ( % 100
and % 4
) 而没有任何关于在带有% 100
.
从指令看来,处理 400 和 100 的操作需要分组,但这似乎将处理 100 和 4 的操作分组。例如,这段代码显然可以工作,并且没有将 1900 列为闰年,但它是如何工作的呢?
当我查看代码时,当迭代达到 1900 时(比如我的开始日期和结束日期分别是 1000 和 2000),它会在第一个 if 检查失败但随后通过两个elsif
s。那么为什么它不是输出的一部分呢?
编辑
这是我对代码的重新格式化。我还做了一些更改,在我看来,这些更改稍微简化了一些事情。
puts 'Input a starting year:'
start_year = gets.chomp.to_i
puts 'Input an ending year:'
end_year = gets.chomp.to_i
puts ''
while start_year <= end_year
if start_year % 400 == 0
puts start_year
elsif start_year % 100 == 0
elsif start_year % 4 == 0
puts start_year
end
start_year = start_year + 1
end