[Project Euler] Problem 19

You are given the following information, but you may prefer to do some research for yourself.

  • 1 Jan 1900 was a Monday.
  • Thirty days has September,
    April, June and November.
    All the rest have thirty-one,
    Saving February alone,
    Which has twenty-eight, rain or shine.
    And on leap years, twenty-nine.
  • A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.

How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?

 

 

这道题,一开始读题误解了意思,浪费了不少时间。注意要求解的是21世纪里有多少个星期天发生在一个月的第一天。

 

开始自己没用库类,活生生的写出了下面的代码:

def yearbeginweek(year):

    """ Function to calculate the week of the first day in a year"""

    yearrange = range(1900, year)

    days = 0

    for x in yearrange:

        if x in leapyears:

            days = days + 366

        else:

            days = days + 365

    return  1 + days % 7

 

week = {1: "Mon", 2: "Tue", 3: "Wen", 4: "Thr", 5: "Fri", 6: "Sat", 7: "Sun"}

years = range(1900, 2001)

leapyears = [x for x in years if (x % 4 == 0 and x % 100 != 0) or (x % 100 == 0 and x % 400 == 0)]

nonleapyears = [x for x in years if not x in leapyears]

leapdays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30]

nonleapdays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30]



suncount = 0

for year in range(1901, 2001):

    # Calculate the first week day in the year

    begin = yearbeginweek(year)

    if begin == 7:

        suncount += 1

        begin = 0

    # If it is a leap year

    if year in leapyears:

        for days in leapdays:

            if (begin + days % 7) % 7 == 0:

                suncount += 1

            begin = (begin + days % 7) % 7

    else:

        for days in nonleapdays:

            if (begin + days % 7) % 7 == 0:

                suncount += 1

            begin = (begin + days % 7) % 7



print suncount



        

    

这个比较囧,后来看了有个Datetime module,一句话就可以解决这个问题了:

import datetime

print len([datetime.date(year, month, 1) for year in range(1901, 2001) for month in range(1, 13) if datetime.date(year, month, 1).weekday() == 6])

这不得不佩服python的类库实在强大。

你可能感兴趣的:(project)