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