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 = 0for 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) % 7print suncount
這個比較囧,後來看了有個Datetime module,一句話就可以解決這個問題了:
import datetimeprint 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的類庫實在強大。