题目描述:
题目还是很好懂的,因为就是算一个循环的年份,然后计算每一个月的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] << " "; }