此题通过一个公式(基姆拉尔森星期计算公式),来将周几计算出来,然后挨个判断就好,分清楚步骤即可。
#include<bits/stdc++.h>
using namespace std;
int Kim_Larson(int y,int m,int d){ //计算周几
if(m==1||m==2){
y--;
m+=12;
}
int w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;
return w;
}
int check_day(int y,int m){ //判断此年此月有多少天
int day;
switch(m){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:day=31;break;
case 4:
case 6:
case 9:
case 11:day=30;break;
case 2:
if(y%400==0||y%4==0&&y%100!=0)
day=29;
else
day=28;
break;
}
return day;
}
int main(){
int cnt=0,day;
for(int y=2000;y<=2019;y++){ //计算2000年1月1日~2019年12月31日之间
for(int m=1;m<=12;m++){
day=check_day(y,m);
for(int d=1;d<=day;d++){
if(d==1||Kim_Larson(y,m,d)==1)
cnt+=2;
else
cnt+=1;
}
}
}
int y=2020; //单独计算2020年1月1日~2020年9月30日之间;
for(int m=1;m<=9;m++){
day=check_day(y,m);
for(int d=1;d<=day;d++){
if(d==1||Kim_Larson(y,m,d)==1)cnt+=2;
else
cnt+=1;
}
}
cnt+=2; //最后计算2020年10月1日,(因为是月首,直接加2就好)
cout<<cnt;
}