题目描述:
题目还是很好懂的,因为就是算一个循环的年份,然后计算每一个月的13号是星期几,然后记下来,最后输出每个星期几出现了几次。顺序是周六,周日...周四,周五这样的。
算法思想:
这道题还是考实现吧,因为根本没有什么算法的思想在内,只是考自己的代码能否把自己心中的想法表达出来。
关于代码的描述大概就是把每一个月的天数记下来,注意在循环的时候判断是不是闰年然后相对应的改2月的数值。然后提前算出1900年1月13号是周六。最后根据模运算来确定一个月后的13号是周几。关于这个模运算,就是说如果31 mod 7 = 4,那么一个31天的月份过去后,当前的星期就加上4。
代码部分:
#include <fstream>
#include <iostream>
using namespace std;
int result[8];
int day[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
bool is_leap(int y) {
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) return 1;
else return 0;
}
int main() {
ifstream fin("friday.in");
ofstream fout("friday.out");
result[6] ++;
int n;
fin >> n;
int pre = 6;
for (int i = 1; i <= n; i++) {
if (is_leap(1900 + i - 1)) day[2] = 29;
for (int j = 1; j <= 12; j++) {
if (i == 1 && j == 1) continue;
int temp = (j == 1) ? j - 1 + 12 : j - 1;
int cur = pre + day[temp] % 7;
while (cur > 7) cur -= 7;
result[cur]++;
pre = cur;
}
day[2] = 28;
}
for (int i = 6; i < 13; i++) {
if (i == 12) {
fout << result[i - 7] << endl;
break;
}
if (i > 7) fout << result[i - 7] << " ";
else fout << result[i] << " ";
}