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
3
2017-08-06
2017-08-07
2018-01-01
Sample Output
2023
2023
2024
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
bool is(int year) {
return year%400==0||year%4==0&&year%100!=0;
}
int add(int year,int month,int day) {
if(is(year)) {
if(month<=2)
return 366;
else return 365;
} else if(month>2) {
return 365+is(year+1);
} else return 365;
}
void solve() {
char s[20];
scanf("%s",s);
for(int i=0; i<10; ++i)
s[i]-='0';
int year=s[0]*1000+s[1]*100+s[2]*10+s[3],month=s[5]*10+s[6],day=s[8]*10+s[9];
int cnt=0;
if(month==2&&day==29) {
while(!cnt||cnt%7!=0) {
year+=4;
cnt+=365*4+1;
if(!is(year)) {
year+=4;
cnt+=365*4;
}
}
cout<<year<<endl;
return;
}
while(!cnt||cnt%7!=0) {
cnt+=add(year,month,day);
year++;
}
cout<<year<<endl;
}
int main() {
int n;
scanf("%d",&n);
while(n--)
solve();
return 0;
}