根据此Seven Day Week Entry on WikiPeda,使用农历时,美国每年包含52周,<{3}}。
使用这些计算假设,我想要一般算法,无论语言告诉我哪几个月有重复的5天。
请参阅this question。(这只给我星期五,我不知道答案是否已经优化)
我想补充以下内容:
Why 5 Fridays, 5 Saturdays and 5 Sundays don’t occur every 823 years,
因此,如果只给出任何合理的年份,算法会返回该年中每个月重复5次的月份组合,这样我就不必去上面的链接来弄清楚它们是什么。
语言相关功能和方法:
根据下面的答案,我想我会添加Jim Mischel提到的一些内置函数:
这些是主要的。如果有人有更多,请告诉我。
答案 0 :(得分:1)
请注意,现在几乎所有的编程语言都带有库函数,可以为您完成所有这些。或者有第三方提供的图书馆。但是如果你想自己计算它。 。
正如您的链接所解释的那样,任何31天的月份都会有五天的五天。如果月份从星期日开始,那么将有五个星期日,五个星期一和五个星期二。
如果您知道一年中第一天的哪一天,那么可以轻松计算任何一个月的第一天。如果您将0表示为星期日,1表示星期一,2表示星期二等,那么您可以通过一些模数运算找到任意月份的第一天。
2月的第一天等于1月的第一天加上31,mod 7.即:
feb1 = (jan1 + 31) % 7
因此2014年开始于周三。那将是第3天。
(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月的第一天是星期一。让我们看看公式是否有效。 1月的第一天是星期三,抵消表说我们需要在9月添加5的偏移量:
(3 + 5) % 7 = 1 (Monday)
对于闰年,如果您在2月之后寻找一个月,则需要在偏移量中添加一个。以2012年为例。1月的第一天是星期天。使用与上述相同的公式,并在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 6