题意:
已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
代码:
1. 模拟计数
我这丑陋的计数...... 但是不记得日期公式的话硬着头皮也要写......
#include<bits/stdc++.h>
using namespace std;
int main(){
int y,m,d;
cin>>y>>m>>d;
int tmp=0;//输入的日期距2011/11/11差几天
if(y>2011||y==2011&&m>11||y==2011&&m==11&&d>11){//2011/11/11年之后
if(y==2011&&m==11) tmp+=d-11;
else if(y==2011&&m>11){
tmp+=30-11+d;
}else{
tmp+=30-11+31+d;
for(int i=2012;i<y;++i){
if(i%4==0&&i%100!=0||i%400==0) tmp+=366;
else tmp+=365;
}
for(int i=1;i<m;++i){
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) tmp+=31;
if(i==4||i==6||i==9||i==11) tmp+=30;
if(i==2&&(y%4==0&&y%100!=0||y%400==0))tmp+=29; else tmp+=28;
}
}
switch(tmp%7){
case 1: puts("6");break;
case 2: puts("7");break;
case 3: puts("1");break;
case 4: puts("2");break;
case 5: puts("3");break;
case 6: puts("4");break;
case 0: puts("5");break;
}
}else{//2011/11/11之前
for(int i=y;i<2011;++i){
if(i%4==0&&i%100!=0||i%400==0) tmp+=366;
else tmp+=365;
}
for(int i=1;i<11;++i){
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) tmp+=31;
if(i==4||i==6||i==9||i==11) tmp+=30;
if(i==2) tmp+=28; //这里直接加28哦 2011年的2月
}
tmp+=11;
int cnt=d;
for(int i=1;i<m;++i){
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) cnt+=31;
if(i==4||i==6||i==9||i==11) cnt+=30;
if(i==2&&(y%4==0&&y%100!=0||y%400==0)) cnt+=29; else cnt+=28;
}
tmp-=cnt;
switch(tmp%7){
case 1: puts("4");break;
case 2: puts("3");break;
case 3: puts("2");break;
case 4: puts("1");break;
case 5: puts("7");break;
case 6: puts("6");break;
case 0: puts("5");break;
}
}
return 0;
}
2. 日期公式:https://blog.csdn.net/Dream_Weave/article/details/80487951
年月日-->星期X
1、基姆拉尔森:w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7 // w:0:星期一...依此类推
int cal1(int y,int m,int d){
if(m==1||m==2)
m+=12,y--;
int w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
return ++w;
}
2、蔡勒公式:w=(y+y/4+c/4-2*c+26*(m+1)/10+d-1+7)%7 // w:0:星期日...依此类推
int cal2(int y,int m,int d){
if(m==1||m==2)
m+=12,y--;
int c=y/100,ty=y%100;
int w=ty+ty/4+c/4-2*c+26*(m+1)/10+d-1;
return w%7==0?7:(w+7)%7;
}
公式符号说明:
w:0:星期日...依此类推(后面+7是因为考虑负数情况)
c:世纪-1(y前两位数)
y:年(y后两位数)
m:月(m>=3 && m<=14,即在蔡勒公式和基姆拉尔森公式中,某年的1、2月要看作上一年的13、14月来计算,如:2003年1月1日-->2002年的13月1日)
d:日
AC代码:
#include<bits/stdc++.h>
using namespace std;
int call(int y,int m,int d){
if(m==1||m==2) m+=12,--y;
int w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
return ++w;
}
int main(){
int y,m,d;
cin>>y>>m>>d;
cout<<call(y,m,d)<<endl;
return 0;
}