我目前正在尝试解决USACO培训网站中的一些问题,以准备无关的C ++编程竞赛。
但是,我坚持这个问题:
本月13日的星期五是否比一周中的任何其他日子少?要回答这个问题,请编写一个程序,计算每个月13日在一个给定的N年期间在星期日,星期一,星期二,星期三,星期四,星期五和星期六登陆的频率。测试的时间段为1900年1月1日至1900年12月31日+ N-1,给定年数,N。N为非负数且不超过400。
数字N在输入文件中提供,输出是一个包含七个数字的文件,每个数字代表一周中特定日期的第13个数字。
我想知道你们如何处理这个问题。我不是在寻找代码或其他任何东西,因为那样会破坏我这样做的目的,而只是一个起点或算法会有所帮助。
到目前为止,我唯一能想到的是使用世界末日算法,但我不确定如何在代码中实现它。
非常感谢任何帮助。
答案 0 :(得分:3)
N小于400?好吧,你最多需要超过365.25 * 400 = 146100天。听起来容易列举所有这些,将日期转换为年/月/日(使用您最喜欢的日期转换例程),测试星期几是微不足道的。
我会预先计算表格。
答案 1 :(得分:3)
正如Denny所说,N非常小,您可以使用一个月中的表和一个简单的闰年谓词来轻松地遍历这几个月来处理二月。只是找出1月13日在1900年的哪一天,然后将经过的天数加起来直到2月13日,然后是3月13日等。使用%
运算符将经过的天数换回一天 - 周价值。
答案 2 :(得分:2)
只需使用蛮力。像这个pseudocode例子一样:
from datetime import date
day_names = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday',
'Saturday', 'Sunday']
counts = [0] * 7
for year in range(1900, 2300):
for month in range(1, 13):
counts[date(year, month, 13).weekday()] += 1
for day, count in zip(day_names, counts):
print('%s: %d' % (day, count))
“硬”部分是calculating the day of the week a date falls on。在C(++)中,您可以使用mktime和localtime库函数,如果您知道您的平台处理足够大的日期范围。