我试图找到任何用户输入年份的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;
答案 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年及更早)