模拟+枚举算法
1、分别计算每年每个月距离1900年1月1日的天数,
2、通过每个月更新天数,然后加上13获得13号的对应的天数,再对7求余,直接获得星期日期。
需注意12月的天数需要单独更新。
3、通过w数组记录进行记录。所有年份月份都统计过后输出。
#include<bits/stdc++.h>
using namespace std;
int a[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年每月的天数
int b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年每月的天数
int w[7]; //0表示星期日,其余i表示星期i。w[i]:表示星期i对应的天数
int n,s; //n:数年 s:是总的天数
void check_1() //对闰年的检查
{
for(int i=1;i<=12;i++)
{
s=s+a[i-1]; //累加上个月的天数
int m=s+13; //本月13号距离1900年1月1日相差多少天
w[m%7]++; //m%7结果为对应星期,0:表示星期日
}
s=s+a[12]; //累加上12月份的时间
}
void check_2() //对平年的检查
{
for(int i=1;i<=12;i++)
{
s=s+b[i-1]; //累加上个月的天数
int m=s+13; //本月13号距离1900年1月1日相差多少天
w[m%7]++; //m%7结果为对应星期,0:表示星期日
}
s=s+b[12]; //累加上12月份的时间
}
int main()
{
scanf("%d",&n);
for(int i=0;i<=n-1;i++)
{
int t=i+1900;
if(t%4==0&&t%100!=0||t%400==0) //判断是否是闰年
check_1(); //是闰年
else
check_2(); //是平年
}
cout<<w[6]<<" "<<w[0]<<" "<<w[1]<<" "<<w[2]<<" "<<w[3]<<" "<<w[4]<<" "<<w[5];
return 0;
}