假设 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);
}
谁能证实我的想法是正确的还是完全错误的??
提前致谢,祝您玩得愉快 :)
您的月份范围从 1
到 11
。由于您不计算 12 月的星期五,因此您的结果相差大约 1/12,实际上是 345*11/12 = 316.25.
我被要求解决这个问题。我的代码输出 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);
}
谁能证实我的想法是正确的还是完全错误的?? 提前致谢,祝您玩得愉快 :)
您的月份范围从 1
到 11
。由于您不计算 12 月的星期五,因此您的结果相差大约 1/12,实际上是 345*11/12 = 316.25.