星期问题 打表 枚举
#include<iostream>
using namespace std;
int weekdays[7];
int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int N;
int main()
{
cin >> N;
int days = 0;
for(int i = 1900; i < 1900 + N; ++i)
{
for(int j = 1; j <= 12; ++j)
{
weekdays[(days+12) % 7] ++;
days += month[j];
if(j == 2 && (i % 100 && i % 4 == 0 || i % 400 == 0)) days++;
}
}
for(int i = 5, j = 0; j < 7; i = (i+1) % 7,++j)
{
cout << weekdays[i] << " ";
}
cout << endl;
return 0;
}
代码思路
直接用一个days变量表示偏移量(表示这一年的某个月的1号距离 1900 . 1. 1的偏移量 )
这里使用枚举直接遍历,有一个公式法这里不说明
外层循环为每一年,这里的N,表示的N年内,例如输入的N = 1, 则表示只有 1900 年这年。
然后内层循环遍历的是每一个月,由于days表示的是每个月的1号距离1900 . 1. 1的过去多少天, 故加上12表示的就是这个月的13号距离1900 . 1. 1过去了多少天,然后模上7,即可得到星期。然后将days加上这个月的天数得到下个月的1月1号距离1900 .1.1过去多少天,注意这里判断一下二月的情况,是闰年的话要再加上一天。 然后最后输出即可,注意输出的顺序