如何找到任何一年 11 月的第四个星期四?

How to find the fourth thursday of november for any year?

我正在尝试查找任何用户输入年份的 11 月的第四个星期四(感恩节)。我使用以下函数查找用户输入年份的前一年的 12 月 31 日。

int yr;
int lastDayofDecember;
scanf("%i",&yr);
lastDayofDecember = (((yr-1)*365)+((yr-1)/4)-((yr-1)/100)+((yr-1)/400))%7;

其中,lastDayofDecember = 0 : Sunday, 1 : Monday,......6:Saturday;

现在 year 2016,最后一天是星期六,即 lastDayofDecember = 6,我在其中添加了 5 以查找一月的第一个星期四,并在其中添加了 304它找到 11 月的第一个星期四(1 月 1 日 - 11 月 1 日是非闰年的 304 天),我在其中添加 21 以找到 11 月的第四个星期四,但现在我对下一步该做什么感到困惑。我不能使用循环

    int txDay = 5 + 304 + 21;

分解一下,虽然它不直接与编程有关,但它是一个有趣的话题——假设只有公历 *):

随着工作日每年提前一个,可以使用一年的简单模 7 来计算。这里唯一的问题是闰年,你已经有了适应这些的公式。

你实际上是在 Ring 7 中进行计算,所以你只需添加跳跃数到您当前年份为止的年数。利用整数除法,这个数字是

year/4 - year/100 + year/400

因此,要获得一个介于 0 和 7 之间的唯一数字,每个数字对应一周中的一天,您只需执行 (year + year/4 - year/100 + year/400) % 7。对于年初的日期,这会有点复杂,但由于我们对 11 月感兴趣,对于闰年,29。2 月已经过去了 -> 无事可做。

感恩节的最晚可能日期是 28 日,当时 11 月 1 日是星期五。因此,对于 11 月从星期五开始的年份,您希望计算出的值为 0。您可以通过实验发现,您需要在 Ring 中添加 5 的偏移量才能实现这一点。这样,您只需要从这个最新的可能日期 28 中减去该值。这给出了完整的公式:

int thanksGivingDate = 28 - (5 + year + year/4 - year/100 + year/400) % 7;

*) 由于这使用公历规则,因此对于仍使用儒略历的旧日期,结果将 不正确 。 (例如 U.S 的 1752 年及更早版本。)