我是 C 语言的初学者,需要帮助。我试图根据一个假日期(2007 年 1 月 1 日为星期六,指定为 5)计算出 2005 年 1 月 1 日是星期几。
当我运行代码时给出的答案是 3,而它应该是 6。当我仅迭代一年(2006 年)时,答案是正确的,但是当我将其更改为 2005 年时,变量 dayweek 没有更新并且而不是回到 5(在开始时分配的)。如何解决这个问题?
#include <stdio.h>
int dayofweek(void) {
int monthdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int dayweek = 5;
int month;
int year;
for (year = 2006; year >= 2005; year--) {
for (month = 12; month > 0; month--) {
dayweek = (dayweek - (monthdays[month - 1] % 7));
if (dayweek < 0)
dayweek = (dayweek + 7);
}
}
return dayweek;
}
int main() {
int result = dayofweek();
printf("Day of the week for January 1st: %d\n", result);
return 0;
}
我认为它正在按预期工作,并且 3 是正确答案。 (可能有错误,如有需要欢迎指正)。
快速解释:我检查了日历,每年从+1天开始。 2021 年从星期五开始,2022 年从星期六开始,2023 年从星期日开始。向后移动意味着 -1 基础,因此从 2007 年的星期六 (5) 开始应该会导致 2005 年的星期四 (3)。
详细解释:我认为可以将代码减少到-1结果。
1°)在每一步中,我们计算每个月天数的模。这可以在这个数组中预先计算:
{3, 0, 3, 2, 3, 2, 3, 3, 2, 3, 2, 3}
2°)在每一步中,我们都会从当天的周中减去这些结果,然后我们将其保持为正值。我们可以通过将上面的数组打包为一个值来一次性完成这一切:29。所以一年意味着
dayweek -29
。
3°)那么我们需要保持这个正数,所以我们可以多次给这个结果加7,相当于减去29这个量,相当于计算
29 % 7
,就是一。
所以一年是
dayweek -1
,这证实了快速解释。
另外,我尝试一步步运行你的代码,没有发现任何错误,至少对我来说是这样。在我这边,当年份从 2006 年变为 2005 年时,变量 dayweek 并没有回到 5
我认为你的代码是正确的,并且运行良好,我想说只有你的期望误导了你。