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