题目描述
题目链接:
https://www.acwing.com/problem/content/1343/
思路分析
-
两种思路:一个是按月份枚举和按天枚举
-
按月份枚举
-
按天枚举
从1900.1.1开始枚举,13号就++,月数过12,year++,week过周天就day++
代码实现
按月份枚举
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//定义13个正好下标就和月份对上
int weekday[7];//0是周一,1是周二......
int main()
{
int n;
cin>>n;
int days=0;//当前1月1号距离1900年1月1号过了多少天
for(int year=1900;year<1900+n;year++)
{
for(int i=1;i<=12;i++)
{
weekday[(days+12)%7]++;
days+=month[i];//这个月13号的星期几的编号
if(i==2)
{
if( year%100&&year%4==0||year%400==0)
days++;
}
}
}
for(int i=5,j=0;j<7;i=(i+1)%7,j++)
cout<<weekday[i]<<' ';
cout<<endl;
return 0;
}
按天枚举
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 打表
int weekday[7];
int get(int year, int m)
{
if (m != 2) return months[m];
if (year % 100 && year % 4 == 0 || year % 400 == 0)
return 29;
return 28;
}
int main()
{
int n;
cin >> n;
int week = 0;
int year = 1900, month = 1, day = 1;
while (year < 1900 + n)
{
if (day == 13) weekday[week] ++ ;
week = (week + 1) % 7;
day ++ ;
if (get(year, month) < day)
month ++, day = 1;
if (month > 12)
month = 1, year ++ ;
}
for (int i = 5, j = 0; j < 7; i = (i + 1) % 7, j ++ )
cout << weekday[i] << ' ';
cout << endl;
return 0;
}