1.用途:给你年月日,计算今天星期几
2.公式:Week = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1) mod 7;
其中: d为几号,m为月份,y为年份
3.注:把一月和二月看为是上一年的十三月和十四月!!
4.板子:
int Date(int y,int m,int d) { if(m==1||m==2){//一二月换算 m+=12; y--; } int week = (d + 2*m +3*(m+1)/5 + y + y/4 - y/100 + y/400 + 1)%7; return week;//其中1~7表示周一到周日 }
5.例题HDU6112 今夕何夕
题意:接下来最近的哪一年里的同一个日子,和今天的星期数一样?
代码:
#include <iostream> #include <cstring> #include<cstdio> using namespace std; int Date(int y,int m,int d) { if(m==1||m==2){ m+=12; y--; } int week = (d + 2*m +3*(m+1)/5 + y + y/4 - y/100 + y/400 + 1)%7; return week; } bool judgeYear(int y) { if((y%4==0&&y%100!=0)||y%400==0) return true; return false; } int main() { int T; scanf("%d",&T); int year,month,day; while(T--){ scanf("%d-%d-%d",&year,&month,&day); int week = Date(year,month,day); for(int i = year+1;i<10000;i++)//枚举判断 { if(judgeYear(year)&&month==2&&day==29&&!judgeYear(i))continue;//注意特别判断第一年闰年2月29第二年不存在的情况! if(week == Date(i,month,day)){ printf("%d\n",i); break; } } } return 0; }