假设 2002 年 3 月 24 日是星期三,请用 C 语言编写一段代码,找出从 1801 年 1 月 1 日到 2000 年 12 月 31 日的第 5 个星期五有多少个星期五?

write a code in c to find how many Fridays fell on the fifth of the month from 1 Jan 1801 to 31 Dec 2000, given 24 March 2002 was a Wednesday?

我被要求解决这个问题。我的代码输出 316,但有些人认为 345 是正确答案。我不知道我的代码是否正常工作,因为我使用 Sakamoto 算法计算给定日、月和年的工作日。由于 2002 年 3 月 24 日的实际日期是星期日而不是星期三(0 是星期日 ... 6 是星期六)。我在算法中添加 3(作为常量变量)。这是我有点犹豫我是否做出正确选择的地方。但是,我认为转变不会影响任何事情,所以这应该有效吗??或者,我可以将工作日设置为星期二而不是星期五,没有任何常数。

这是我的代码:

#include <stdio.h>
#include <math.h>

int howManyDays() {
    int sakamoto();
    
    int starting_weekday = 3;
    int result = sakamoto(24,3,2002,0);
    int constant = starting_weekday - result;

    int calculated_year = 1801;
    int calculated_month = 1;
    int count = 0;

    do {
        int calculated_weekday = sakamoto(5, calculated_month, calculated_year, constant);
        //int calculated_weekday = (calculated_day+constant+day_in_months[calculated_month-1]) % 7;

        if (calculated_weekday == 5) {
            count += 1;
        }

        calculated_month += 1;

        if (calculated_month == 12) {
            calculated_month = 1;
            calculated_year += 1;
        } 

    } while(!(calculated_month == 1 && calculated_year == 2001));
    return count;
}

int sakamoto(int d, int m, int y, int c) {
    int offset[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}; // 0->Sunday ... 2->Tuesday ... 6->Saturday
    y -= m < 3;

    return (y + y / 4 - y / 100 + y / 400 + offset[m - 1] + d + c) % 7;

}


int main() {
    int a = howManyDays();
    printf("result: %d", a);
}

谁能证实我的想法是正确的还是完全错误的?? 提前致谢,祝您玩得愉快 :)

您的月份范围从 111。由于您不计算 12 月的星期五,因此您的结果相差大约 1/12,实际上是 345*11/12 = 316.25.