据七天一周的WikiPeda条目报道,在美国,一年的农历由52周组成。
计算假设
使用这些计算假设,我想要通用算法,而不管哪种语言告诉我哪个月有重复的5天。
请参阅这个问题。(这只给我星期五,我不知道答案是否优化)
我想补充以下几点:
为什么5个星期五,5个星期六和5个星期日不是每隔823年发生一次,
因此,只要给定合理的年份,算法就会在该年内返回每一个月的组合,其中的日子重复5次,这样我就不必到上面的链接去找出它们是什么了。
语言相关函数和方法
本着下面这个伟大答案的精神,我想我应该添加Jim Mischel提到的一些内置函数:
这些是主要的。如果有人有更多的,请告诉我。
发布于 2014-06-20 03:20:16
请注意,现在几乎所有的编程语言都附带了库函数,这些函数将为您完成所有这些工作。或者有这样一个图书馆可以从第三方获得。但如果你想自己计算的话。。。
正如您的链接所解释的,任何有31天的月份都会有五次三天的事件。如果这个月从星期天开始,那么就有五个星期天,五个星期一和五个星期二。
如果你知道一年的第一天是哪一天,那么就很容易计算出每个月的第一天。如果你用0作为周日,1是星期一,2是星期二等等,那么你可以通过做一些模数运算就可以找到任何一个月的第一天。
二月一日等于一月一日加三十一日第七季,即:
feb1 = (jan1 + 31) % 7因此,2014年从周三开始。那将是第三天。
(3 + 31) % 7 = 34 % 7 = 6 (Saturday)你可以通过查看今年的日历来验证。
使用该技术计算其他月份需要构建一个表,其中包含每个月底的累计天数。但这没必要。您真正需要的是一个由12个条目组成的表,该表告诉您每个月的偏移量,以及在闰年中比2月晚一个月添加1的一点逻辑。
以2014年为例。下表显示每个月的开始日期。
January Wednesday (3)
February Saturday (6)
March Saturday (6)
April Tuesday (2)
May Thursday (4)
June Sunday (0)
July Tuesday (2)
August Friday (5)
September Monday (1)
October Wednesday (3)
November Saturday (6)
December Monday(1)我们真正需要的是每个月的补偿。你看,二月的第一天和一月的第一天的差别是3,三月也一样。四月份的差别是-1。要用模块化算法工作,您需要生成6。无论如何,您可以构建一个表,告诉您每个月需要添加的偏移量:
January 0
February 3
March 3
April 6
May 1
June 4
July 6
August 2
September 5
October 0
November 3
December 5如果你知道一年中的第一天,那么你就可以计算出每个月的第一天。参考日历,你会发现2014年9月的第一天是星期一。让我们看看公式是否行得通。一月的第一天是星期三,抵消表说我们需要为九月增加一个5的抵消额:
(3 + 5) % 7 = 1 (Monday)对于闰年,如果您要在2月后的一个月内查找,则需要在偏移量中添加一个。以2012年为例。一月的第一天是星期天。使用与上述相同的公式,并在闰年(2012年9月1日)添加1是:
(0 + 5 + 1) % 7 = 6 (Saturday)唯一的诀窍是找到1月1日的一天,你在评论中得到了一个链接。在此之后,它是一个简单的表查找、加法和模块化算法。
顺便说一下,通过创建用于闰年的第二个偏移表,您可以稍微加快算法的速度。该表将是:
January 0
February 3
March 4
April 0
May 2
June 5
July 0
August 3
September 6
October 1
November 4
December 6https://stackoverflow.com/questions/24309978
复制相似问题