HDU6112 今夕何夕(基姆拉尔森公式,2017"百度之星"程序设计大赛

来源:互联网 发布:电子视频制作软件 编辑:程序博客网 时间:2024/05/02 19:50

题目:

今夕何夕

 
 Accepts: 1345
 
 Submissions: 5533
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 32768/32768 K (Java/Others)
Problem Description

今天是2017年8月6日,农历闰六月十五。

小度独自凭栏,望着一轮圆月,发出了“今夕何夕,见此良人”的寂寞感慨。

为了排遣郁结,它决定思考一个数学问题:接下来最近的哪一年里的同一个日子,和今天的星期数一样?比如今天是8月6日,星期日。下一个也是星期日的8月6日发生在2023年。

小贴士:在公历中,能被4整除但不能被100整除,或能被400整除的年份即为闰年。

Input

第一行为T,表示输入数据组数。

每组数据包含一个日期,格式为YYYY-MM-DD。

1 ≤ T ≤ 10000

YYYY ≥ 2017

日期一定是个合法的日期

Output

对每组数据输出答案年份,题目保证答案不会超过四位数。

Sample Input
32017-08-062017-08-072018-01-01
Sample Output
202320232024
思路:

基姆拉尔森公式的应用,注意一下2月29号的情况


代码:

#include<bits/stdc++.h>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int day(int y,int m,int d){if(m==1||m==2){m+=12;y-=1;}int w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;return w;}int runnian(int a){if((a % 4 == 0 && a % 100 != 0) || a % 400 == 0)return 1;elsereturn 0;}int main(){int t,d,m,y;scanf("%d",&t);while(t--){scanf("%d-%d-%d",&y,&m,&d);int flag=0;if(m==2&&d==29)if(runnian(y))flag=1;int x=day(y,m,d);for(int i=y+1; i<=10000; i++){if(flag){if(day(i,m,d)==x&&runnian(i)){printf("%d\n",i);break;}}else{if(day(i,m,d)==x){printf("%d\n",i);break;}}}}return 0;}