On Sat, 01 Apr 2006 02:03:13 GMT, "Dave Burt" <dave / burt.id.au> wrote: Crap, I knew I should have fully tested my code. <snip> >> if input%4 == 0 || input%400 == 0 && input%100 != 0 > >Here's the mistake. > >1984 and 2004 are leap years. OK. >1800 and 1900 are not leap years. Not OK - this program lists them as leap >years. >1600 and 2000 are leap years. OK. > >In case this info helps, && binds more closely than ||, so what you've got >is the same as: > >if input%4 == 0 || (input%400 == 0 && input%100 != 0) > >You should be able to rearrange it to give the correct result for the 1984, >2004, 1800, 1900, 1600 and 2000. Yep. if input%100 != 0 && input%4 == 0 || input%400 == 0 Fix: ------------------------------------------------------------------------------- puts 'Please enter the starting year' input = gets.chomp puts 'Please enter the ending year' input2 = gets.chomp puts puts 'The following are leap years:' input = input.to_i while input <= input2.to_i if input%100 != 0 && input%4 == 0 || input%400 == 0 puts input.to_s end input = input + 1 end ------------------------------------------------------------------------------- 1 line shorter at the expense of readability and performance: ------------------------------------------------------------------------------- puts 'Please enter the starting year' input = gets.chomp puts 'Please enter the ending year' input2 = gets.chomp puts puts 'The following are leap years:' while input.to_i <= input2.to_i if input.to_i%100 != 0 && input.to_i%4 == 0 || input.to_i%400 == 0 puts input.to_s end input = input.to_i + 1 end ------------------------------------------------------------------------------- I actually did a little benchmark calculating all the leap years for the next 100 million years (with output going to nul). Results: 13:26 minutes for the first one. 14:56 minutes for the second one. The shorter code was 11.16% slower.