在学习编程(第二版)中,可以找到给定日期之间的闰年
编写一个要求开始年份和结束年份的程序,然后将所有闰年放在它们之间(如果它们也是闰年,则包括它们)。闰年是可被4整除的年份(如1984年和2004年)。然而,被100整除的年份不是闰年(例如1800和1900),除非它们也可以被400整除(例如1600和2000,实际上是闰年)。真糟糕!
我做了一些挖掘并找到了'答案键'。根据密钥,正确的代码如下:
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
需要更改为float,以及为什么连续有两个elsif
语句(% 100
和% 4
)没有任何说明在% 100
之后要做什么。
从指令中可以看出,需要对处理400和100的操作进行分组,但这似乎有100个和4个分组的操作。例如,这个代码显然有效,并没有将1900列为闰年,但它是如何工作的?
当我查看代码时,当迭代到达1900时(假设我的开始和结束日期分别为1000和2000),如果检查它将失败第一个但是然后传递elsif
两个秒。那么为什么它不是输出的一部分呢?
修改
这是我重新格式化代码。我也做了一些改变,在我看来简化了一些事情。
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
答案 0 :(得分:4)
你的任务非常模糊,你提出的答案会分散注意力。
这就是我在Ruby中解决问题的方法。获取开始和结束年份是微不足道的。
start_year = 1999
end_year = 2050
def leap(year)
year /= 100 if year % 100 == 0
year % 4 == 0
end
puts (start_year..end_year).to_a.find_all { |year| leap(year) }
<强>输出强>
2000
2004
2008
2012
2016
2020
2024
2028
2032
2036
2040
2044
2048
答案 1 :(得分:2)
没有理由转换为float而不是整数。
至于“空”的elseif子句,对于那种情况,它基本上是一个“无操作”,以避免随后的可分为四的测试。具体来说,1900案例满足% 100 == 0
条款,因此不会被视为闰年。
顺便说一下,正如你可能已经猜到的那样,这是非惯用的Ruby,而不仅仅是因为缩进。
答案 2 :(得分:1)
这是打印闰年的另一种方式。我已将范围作为参数传递给函数。
def checkleap(rang)
puts (rang).select{|z| (z % 4 == 0 && z % 100 != 0) || z % 400 == 0}
end
checkleap(2000..3000)
答案 3 :(得分:0)
我只是自己回答了Chris Pine的教程,我相信我的答案(作为一个完整的红宝石nuby)比你的建议更简单:
puts 'What is the starting year?'
starting_year = gets.chomp.to_i
puts 'What is the ending year?'
ending_year = gets.chomp.to_i
while starting_year <= ending_year
if starting_year%4 == 0 || (starting_year%100 != 0 && starting_year%400 == 0)
puts starting_year
end
starting_year+=1
end
答案 4 :(得分:0)
我在ruby docs中查找了数组并找到了这个简单的解决方案:
puts "Starting Year"
syear = gets.chomp
puts "Ending Year"
eyear = gets.chomp
puts ""
lyear = (syear.to_i..eyear.to_i).to_a
lyear.reject!{|x| x % 4 != 0|| (x % 100 == 0 && x % 400 != 0) }
puts lyear
它将范围转换为数组。然后删除不作为闰年分类的元素。
答案 5 :(得分:-1)
puts "What is the starting year?"
start_year = gets.chomp
puts "What is the ending year?"
end_year = gets.chomp
if (start_year.to_i && end_year.to_i)% 4 == 0
puts "The start_year is #{start_year.to_i} and end year is{end_year.to_i}"
for leap in start_year.to_i..end_year.to_i
if leap % 4 == 0
puts "The leap year is #{leap}"
else
puts "No leap year"
end
end
end