#373. 「USACO1.1」Friday the Thirteenth 题解
题目传送门
欢迎大家指出错误并联系这个蒟蒻
更新日志
- 2023-02-01 17:20 文章完成
- 2023-02-03 18:50 文章审核通过
- 2023-02-03 19:17 修改了注释
- 2023-05-25 20:25 修改了 $\LaTeX$
- 2023-05-25 20:32 再次修改了 $\LaTeX$,感谢 ACRUSHj 提出错误
- 2023-07-01 15:55 修改了代码
题目知识点
模拟+数学
闰年知识点
题意说明
写一个程序来计算在 $n$ 年里 $13$ 日落在星期一,星期二......星期日的次数。这个测试从 $1900$ 年 $1$ 月 $1$ 日到 $1900+n-1$ 年 $12$ 月 $31$ 日.n是一个非负数且不大于 $400$ 。请不要预先算好数据 !
很明显,这道题会考察到和年份有关的知识点(已在知识点中列出,欢迎查阅),但是总结一下就是四年一闰,百年不闰,四百年又闰。(不会的话去问小学老师)
代码+解释
// #373. 「USACO1.1」Friday the Thirteenth
// code by:st20250113
#include <bits/stdc++.h> //伟大的万能头文件
using namespace std;
int a[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, b[8]; // a数组预处理每月天数,b数组用来存储答案
int n, c = 0;
int main() {
cin >> n;
for (int i = 1900; i < 1900 + n; i++) {
int f = 0; // 闰年标记
if ((i % 4 == 0) && (i % 100) || (i % 400 == 0)) {
f = 1; // 判断是否为闰年,若成立则f赋值为真
}
for (int j = 1; j <= 12; j++) {
int e = 0; // 如果为闰年,2月就要多一天,e在闰年情况下使2月的循环变量增大1
if (f && j == 2)
e = 1;
for (int k = 1; k <= a[j] + e; k++) { // k循环日期,m[j]即j月的天数
c++; // st每天增加
if (k == 13) {
b[c % 7]++;
}
}
// 防抄袭
if (e == 1) {
e = 0; // 2月用过后要清零
}
}
}
cout << b[6] << " " << b[0] << " " << b[1] << " " << b[2] << " " << b[3] << " " << b[4] << " " << b[5]; // 输出顺序是Sat Sun Mon Tue Wed Thu Fri
return 0; // 华丽结束
}
// QYC最帅