如何找到任何一年 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 年及更早版本。)
我正在尝试查找任何用户输入年份的 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 年及更早版本。)