0

学习编程(第 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在一行中有两个语句 ( % 100and % 4) 而没有任何关于在带有% 100.

从指令看来,处理 400 和 100 的操作需要分组,但这似乎将处理 100 和 4 的操作分组。例如,这段代码显然可以工作,并且没有将 1900 列为闰年,但它是如何工作的呢?

当我查看代码时,当迭代达到 1900 时(比如我的开始日期和结束日期分别是 1000 和 2000),它会在第一个 if 检查失败但随后通过两个elsifs。那么为什么它不是输出的一部分呢?


编辑

这是我对代码的重新格式化。我还做了一些更改,在我看来,这些更改稍微简化了一些事情。

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
4

6 回答 6

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
于 2013-11-10T02:50:38.287 回答
2

没有理由转换为浮点数而不是整数。

至于“空”的 elseif 子句,对于这种情况,它基本上是一个“无操作”,以避免随后的测试为可整除四。具体来说,1900 年的情况满足该% 100 == 0条款,因此它不会被视为闰年。

顺便说一句,正如您可能已经猜到的那样,这是非惯用的 Ruby,不仅仅是因为缩进。

于 2013-11-10T01:14:08.167 回答
1

这是打印闰年的另一种方式。我已将范围作为参数传递给函数。

def checkleap(rang)
  puts (rang).select{|z| (z % 4 == 0 && z % 100 != 0) || z  % 400 == 0} 
end

checkleap(2000..3000)
于 2013-11-10T10:35:32.600 回答
0

我自己只是在回答 Chris Pine 的教程,我相信我回答它(作为一个完整的 ruby​​ 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
于 2013-12-03T17:06:11.333 回答
0

我在ruby​​ 文档中查找了数组,发现了这个简单的解决方案:

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

它将范围转换为数组。然后删除不归类为闰年的元素。

于 2014-05-10T19:46:46.537 回答
-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
于 2016-02-07T14:32:26.037 回答