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

Algorithm 这个有趣事件的最快算法,algorithm,math,Algorithm,Math,根据这项研究,在美国,使用农历一年包括52周 计算假设 12个月x 4周=48周 48周x7天=336天 我们现在用4周零1天的时间将农历与我们的一年相匹配(365.25-336=29) 7个月有额外的3天(21) 4个月有2个额外(8) 我们每四年在二月加上一天,以计算一个季度的天数。通常称为闰年 使用这些计算假设,我需要通用算法,而不考虑告诉我哪些月份的重复天数为5的语言。 看。(这只给了我星期五,我不知道答案是否优化了) 我想添加以下内容: , 因此,只要给定一个合理的年份,该算法就会返

根据这项研究,在美国,使用农历一年包括52周

计算假设
  • 12个月x 4周=48周
  • 48周x7天=336天
  • 我们现在用4周零1天的时间将农历与我们的一年相匹配(365.25-336=29)
  • 7个月有额外的3天(21)
  • 4个月有2个额外(8)
  • 我们每四年在二月加上一天,以计算一个季度的天数。通常称为闰年

  • 使用这些计算假设,我需要通用算法,而不考虑告诉我哪些月份的重复天数为5的语言。
    看。(这只给了我星期五,我不知道答案是否优化了)

    我想添加以下内容:
    ,

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


    依赖于语言的函数和方法

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

    • VB.NET:
    • C#:寻找
    • PHP:我喜欢这种方法
    • SQL Server:,结合2008-R2中的这两项工作+
    • MySQL:

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

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

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

    如果你知道一年的第一天是哪一天,那么计算任何月份的第一天都很容易。如果你用0作为星期天,1是星期一,2是星期二,等等,那么你可以通过做一点模运算找到任何月份的第一天

    2月1日等于1月1日加31日,mod 7。即:

    feb1 = (jan1 + 31) % 7
    
    2014年从周三开始。那将是第三天

    (3 + 31) % 7 = 34 % 7 = 6 (Saturday)
    
    你可以通过查看今年的日历来验证

    使用该技术计算其他月份需要构建一个表,其中包含每个月末的累计天数。但这不是必须的。你真正需要的是一个包含12个条目的表格,告诉你每个月的偏移量,还有一点逻辑,在闰年的二月之后的几个月加上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)
    
    我们真正需要的是每个月的补偿。你可以看到2月1日和1月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)
    
    对于闰年,如果您要查找二月后的一个月,则需要在偏移量中添加一个。以2012年为例。一月的第一天是星期天。使用与上述相同的公式,并为闰年添加1,2012年9月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
    

    计算任何日期的工作日:(我喜欢Zeller算法,但它们都有效)。有用的事实:(1)只有14种可能的日历,这取决于1月1日的工作日以及这一年是否是闰年。(2) 历法的顺序每400年重复一次。(也就是说,年
    y
    的日历与年
    y+400
    的日历相同)@rici所以这里的整个问题是1月1日的那一天?你知道不是每四年都是闰年吗?该规则大约为“每4年,除第100年外,除第400年外”。例如,2016年将是闰年,2100年不是,但2400年将是。。。这与一个事实有关,即每年365.25天仍然只是近似值…@twalberg:准确地说。这就是为什么周期长达400年。(事实上,365*400+97==0 mod 7。)对于公历来说,你不需要在每个世纪初的2月加上1天,除非这条规则不适用于每400年。现在我只需要消化所有这些,本着合作的精神,我将在上面发布一些链接。