您的位置:首页 > 其它

[Project Euler] Problem 19

2011-10-17 20:45 459 查看
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


.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

这个比较囧,后来看了有个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])


.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

这不得不佩服python的类库实在强大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: