给定一个日期,问这个星期是星期几~~
题目链接
这种问题原先一直困扰自己好久~~后来发现了标准套路,
先确定一个日期 所处的星期(作为基点),算要测试的数据距离基点的相差的日期数
以1年月1日为参考点 365*year+ (year-1)/4- (year-1)/100+(year-1)/400+月份的日期+day数+ 再(1或0) 是否当年为闰年并且月月份大于2月
计算出差来,就是相差的日期数 在基点前面的套用公式 ((y-x)%7+7)%7 在基点后 (y+x)%7 0代表的是sunday 其余对应星期数 最好基点选择1年1月1日
postcode:
#include<stdio.h> #include<math.h> #include<stdlib.h> const int days=365; const int s[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; bool Isleap(int y){ if(y%400==0||y%100&&y%4==0)return 1; return 0; } int leap(int y){ if(!y)return 0; return y/4-y/100+y/400; } int cal(int day,int mon,int year){ int res=(year-1)*days+leap(year-1); //细节 不要漏掉 for(int i=1;i<mon;i++) res+=s[i]; if(Isleap(year)&&mon>2)res++; //加 1 是要是闰年 还要月份大于2 res+=day; return res; } int count_day(int da,int ma,int ya,int db,int mb,int yb){ int resa=cal(da,ma,ya); int resb=cal(db,mb,yb); return abs(resa-resb); } int main() { int year,mon,day; while(scanf("%d%d%d",&year,&mon,&day)!=EOF){ int sum=count_day(1,1,1,day,mon,year); int ans=(1+sum)%7; switch(ans){ case 0:printf("Sunday\n");break; case 1:printf("Monday\n");break; case 2:printf("Tuesday\n");break; case 3:printf("Wendesday\n");break; case 4:printf("Thursday\n");break; case 5:printf("Friday\n");break; case 6:printf("Saturday\n");break; } } return 0; }