gpt4 book ai didi

algorithm - 这个有趣事件的最快算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:26:44 25 4
gpt4 key购买 nike

根据这个 Seven Day Week Entry on WikiPeda,在美国使用阴历时一年有 52 周.

计算假设

  1. 12 个月 x 4 周 = 48 周
  2. 48 周 x 7 天 = 336 天
  3. 我们现在将 4 周零 1 天与农历相匹配 (365.25 - 336 = 29)
  4. 7 个月有额外的 3 天 (21)
  5. 4个月有2个extra(8)
  6. 我们每 4 年将 1 天添加到二月,以计算四分之一天。通常称为闰年

使用这些计算假设,我想要通用算法,无论语言如何告诉我哪些月份的重复天数为 5。
参见 this question .(这只给我星期五,不知道答案有没有优化)

我想添加以下内容:
Why 5 Fridays, 5 Saturdays and 5 Sundays don’t occur every 823 years ,

因此,只要给定任何合理的年份,该算法就会返回该年内日期重复 5 次的每个月份组合,这样我就不必转到上面的链接来弄清楚它们是什么。


语言相关的函数和方法:

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

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

最佳答案

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

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

如果您知道一年的第一天是哪一天,那么计算任何一个月的第一天就很容易了。如果你用 0 表示星期日,1 表示星期一,2 表示星期二,等等,那么你可以通过做一点模运算来找到任何一个月的第一天。

二月一日等于一月一日加31模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)

我们真正需要的是每个月的补偿。您会看到 2 月的第一天和 1 月的第一天之间的差异是 3。3 月也一样。对于 4 月,差异为 -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)

对于闰年,如果您要查找二月之后的一个月,则需要将偏移量加一。以 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

关于algorithm - 这个有趣事件的最快算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24309978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com