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

时间:2017-10-23 11:21:26

标签: c modulo

我试图找到任何用户输入年份的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以查找1月的第一个星期四,并将304添加到其中找到11月的第一个星期四(1月1日 - 11月1日是非闰年的304天),我在11月的第四个星期四增加了21天,但现在我对下一步做什么感到困惑。我不能使用循环

    int txDay = 5 + 304 + 21;

1 个答案:

答案 0 :(得分:0)

打破这一点,虽然它不是直接关于编程,但它是一个有趣的话题 - 假设只有格里高利历*):

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

您在Ring 7 中有效地进行了计算,因此您只需要添加闰年数,直到当前年份为止。利用整数除法,这个数字是

year/4 - year/100 + year/400

因此,要获得0到7之间的唯一数字,对应于每周的一天,您只需(year + year/4 - year/100 + year/400) % 7。对于今年早些时候的日期来说,这会有点复杂,但是由于我们对11月感兴趣,闰年,29。2月已经过去了 - >没什么可做的。

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

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

*)由于这使用了格里高利历的规则,对于仍在使用朱利安日历的旧日期,结果将不正确。 (例如美国的1752年及更早)