首先了解一个数学公式:
基姆拉尔森计算公式(已知2018-1-30求出星期二)
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7 在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
C++实现这个公式:
1 #include<iostream> 2 using namespace std; 3 4 int fun(int y,int m,int d){ 5 if(m==1||m==2){ 6 m+=12; 7 y--; 8 } 9 return (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1; 10 } 11 12 int main(void){ 13 int year,month,day; 14 cin>>year>>month>>day; 15 cout<<fun(year,month,day)<<endl; 16 return 0; 17 }
套用这个公式就可以轻易完成黑色星期五了
代码如下:
1 #include<iostream> 2 using namespace std; 3 4 int fun(int y,int m,int d){ 5 if(m==1||m==2){ 6 m+=12; 7 y--; 8 } 9 return (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1; 10 } 11 12 int main(void){ 13 int year; 14 int ans=0; 15 cin>>year; 16 for(int i=1;i<=12;i++){ 17 if(fun(year,i,13)==5) ans++; 18 } 19 cout<<ans<<endl; 20 return 0; 21 }