HDU 6112 今夕何夕 蔡勒公式

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6112题意:中文题目

分析:关键点在与如何计算一个日期是星期几,这个可以通过蔡勒公式来计算。基姆拉尔森计算公式可以通过给定的year month day 计算出给定日期是星期几,注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算,最后这道题要考虑闰年的情况,2月29号只可能在闰年中出现。基姆拉尔森计算公式:  W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 在公式中d表示日期中的日数,m表示月份数,y表示年数。

#include <bits/stdc++.h>
using namespace std;
int cal(int y, int m, int d)
{
    if(m==1||m==2){
        m+=12;
        y--;
    }
    return (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
}
bool leap(int y){
    if(y%400==0||(y%4==0&&y%100!=0)) return true;
    else return false;
}
int main()
{
    int T; scanf("%d", &T);
    while(T--){
        int y,m,d;
        scanf("%d-%d-%d",&y,&m,&d);
        int w=cal(y,m,d);
        int flag=0;
        if(m==2&&d==29){
            flag=1;
        }
        if(flag){
            for(int i=y+1;; i++){
                if(cal(i,m,d)==w&&leap(i)){
                    printf("%d\n", i);
                    break;
                }
            }
        }
        else{
            for(int i=y+1;;i++){
                if(cal(i,m,d)==w){
                    printf("%d\n",i);
                    break;
                }
            }
        }
    }
    return 0;
}

 

posted @ 2017-08-16 19:38  zxycoder  阅读(229)  评论(0编辑  收藏  举报