首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个有趣事件的最快算法

这个有趣事件的最快算法
EN

Stack Overflow用户
提问于 2014-06-19 15:09:05
回答 1查看 232关注 0票数 0

七天一周的WikiPeda条目报道,在美国,一年的农历由52周组成。

计算假设

  1. 12个月x4周= 48周
  2. 48周x7天= 336天
  3. 我们现在有4周零1天的时间来配合我们的农历年历(365.25- 336 = 29)。
  4. 7个月多3天(21天)
  5. 4个月有2个额外的(8)
  6. 我们每四年增加一天到二月,占一天的四分之一。俗称跃年

使用这些计算假设,我想要通用算法,而不管哪种语言告诉我哪个月有重复的5天。

请参阅这个问题。(这只给我星期五,我不知道答案是否优化)

我想补充以下几点:

为什么5个星期五,5个星期六和5个星期日不是每隔823年发生一次

因此,只要给定合理的年份,算法就会在该年内返回每一个月的组合,其中的日子重复5次,这样我就不必到上面的链接去找出它们是什么了。

语言相关函数和方法

本着下面这个伟大答案的精神,我想我应该添加Jim Mischel提到的一些内置函数:

  • VB.NET:寻找第一天和最后一天.
  • C#:寻找第一天和最后一天
  • PHP:我喜欢这种方法,相对日期格式
  • Server:有用日期函数平日的结合在2008年-R2+中工作。
  • MySQL:MySQL获得当前周、月、季度/最后一天的第一天

这些是主要的。如果有人有更多的,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-20 03:20:16

请注意,现在几乎所有的编程语言都附带了库函数,这些函数将为您完成所有这些工作。或者有这样一个图书馆可以从第三方获得。但如果你想自己计算的话。。。

正如您的链接所解释的,任何有31天的月份都会有五次三天的事件。如果这个月从星期天开始,那么就有五个星期天,五个星期一和五个星期二。

如果你知道一年的第一天是哪一天,那么就很容易计算出每个月的第一天。如果你用0作为周日,1是星期一,2是星期二等等,那么你可以通过做一些模数运算就可以找到任何一个月的第一天。

二月一日等于一月一日加三十一日第七季,即:

代码语言:javascript
复制
feb1 = (jan1 + 31) % 7

因此,2014年从周三开始。那将是第三天。

代码语言:javascript
复制
(3 + 31) % 7 = 34 % 7 = 6 (Saturday)

你可以通过查看今年的日历来验证。

使用该技术计算其他月份需要构建一个表,其中包含每个月底的累计天数。但这没必要。您真正需要的是一个由12个条目组成的表,该表告诉您每个月的偏移量,以及在闰年中比2月晚一个月添加1的一点逻辑。

以2014年为例。下表显示每个月的开始日期。

代码语言:javascript
复制
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。无论如何,您可以构建一个表,告诉您每个月需要添加的偏移量:

代码语言:javascript
复制
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的抵消额:

代码语言:javascript
复制
(3 + 5) % 7 = 1 (Monday)

对于闰年,如果您要在2月后的一个月内查找,则需要在偏移量中添加一个。以2012年为例。一月的第一天是星期天。使用与上述相同的公式,并在闰年(2012年9月1日)添加1是:

代码语言:javascript
复制
(0 + 5 + 1) % 7 = 6 (Saturday)

唯一的诀窍是找到1月1日的一天,你在评论中得到了一个链接。在此之后,它是一个简单的表查找、加法和模块化算法。

顺便说一下,通过创建用于闰年的第二个偏移表,您可以稍微加快算法的速度。该表将是:

代码语言:javascript
复制
January   0
February  3
March     4
April     0
May       2
June      5
July      0
August    3
September 6
October   1
November  4
December  6
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24309978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档