The following information is given.
January 1, 1900 is Monday. September, April, June, and November have up to 30 days, and all months except February have up to 31 days. February has 28 days, but in leap years it is 29 days. A leap year occurs in a year when the Christian era is divisible by 4. However, a year when the Christian era is not divisible by 400 and divisible by 100 is not a leap year. How often does the beginning of the month be Sunday during the 20th century (January 1, 1901-December 31, 2000)? http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2019
Sunday: 0 Monday: 1 Tuesday: 2 Wednesday: 3 Thursday: 4 Friday: 5 Saturday: 6 And. The next date of the first day of the next month can be calculated from the day of the week date of the first day of the previous month and the number of days of the previous month by the following formula. (7 is the number of days of the week). Using this, I wrote the following code.
nextdate = (date+days) % 7
# -*- coding: utf-8 -*-
def getdays(month, year):
if month in [1,3,5,7,8,10,12]:
return 31
elif month in [4,6,9,11]:
return 30
elif year%400 == 0:
return 29
elif year%100 == 0:
return 28
elif year%4 == 0:
return 29
else:
return 28
def nextdate(date, month, year):
return (date + getdays(month, year)) % 7
def nextmonth(month, year):
if month == 12:
#December to the next year
return (1, year+1)
else:
return (month+1, year)
def main():
STARTYEAR = 1901
LASTYEAR = 2000
(date, month, year) = (1, 1, 1900)
ans = 0
while year <= LASTYEAR:
#Last month date,month,year to next month date(Day of the week)Get
date = nextdate(date, month, year)
#month,Increment year
(month,year) = nextmonth(month, year)
#year is in range and date is 0(Sunday)Then add 1 to ans.
if STARTYEAR <= year <= LASTYEAR and date == 0:
ans += 1
print ans
main()
Recommended Posts