ACM数论----基姆拉尔森计算公式(今天计算星期几)

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 
#include 
#include
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;
}

 

你可能感兴趣的:(====思维定理====,数论+几何)