算法1(按天枚举)
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int weekdays[7];
int get(int year,int m)
{
if(m!=2) return months[m];
if((year%100!=0&&year%4==0)||(year%400==0))
{
return 29;
}
return 28;
}
int main()
{
int n;
cin>>n;
int index = 0;//周一是0号索引
int year = 1900,month=1,day=1;//1990-1-1
while(year<1900+n)
{
if(day==13) weekdays[index]++;//十三号
index=(index+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 << weekdays[i] << ' ';
cout << endl;
return 0;
}
算法2(按月枚举)
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 打表
int weekday[7];
int main()
{
int n;
cin>>n;
int days=0;
for(int year=1900;year<1900+n;year++)
{
for(int i=1;i<=12;i++)
{
weekday[(days+12)%7]++;//第一个13号是周六
days+=months[i];
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;
}