#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
/*
蔡勒公式
接下来最近的哪一年里的同一个日子,和今天的星期数一样?
比如今天是8月6日,星期日。下一个也是星期日的8月6日发生在2023年。
在公历中,能被4整除但不能被100整除,或能被400整除的年份即为闰年。
对每组数据输出答案年份,题目保证答案不会超过四位数。
*/
int solve(int iYear,int iMonth,int iDay)//已知年月日,计算星期
{
int iWeek = 0;
int y = 0, c = 0, m = 0, d = 0;
if ( iMonth == 1 || iMonth == 2 )
{
c = ( iYear - 1 ) / 100;
y = ( iYear - 1 ) % 100;
m = iMonth + 12;
d = iDay;
}
else
{
c = iYear / 100;
y = iYear % 100;
m = iMonth;
d = iDay;
}
iWeek = y + y / 4 + c / 4 - 2 * c + 26 * ( m + 1 ) / 10 + d - 1;
iWeek = iWeek >= 0 ? ( iWeek % 7 ) : ( iWeek % 7 + 7 );
if ( iWeek == 0 )
{
iWeek = 7;
}
return iWeek;
}
bool judge(int y)//是否为闰年
{
if((y%4==0&&y%100!=0)||y%400==0)
return 1;
else
return 0;
}
int main()
{
int t;
int y,m,d;
scanf("%d",&t);
while(t--)
{
scanf("%d-%d-%d",&y,&m,&d);
bool flag=0;
if(judge(y))
{
flag=1;
}
int a=solve(y,m,d);
int ans=0;
if(flag&&m==2&&d==29)//如果是闰年的2-29,那么同样只有闰年才有2-29
{
for(int i=y+1;i<=9999;i++)
{
if(solve(i,m,d)==a&&judge(i))//找到相同星期的闰年
{
ans=i;
break;
}
}
}
else
{
ans=y+1;
int b=solve(ans,m,d);
while(b!=a)
{
ans++;
b=solve(ans,m,d);
}
}
printf("%d\n",ans);
}
}
HDU6112 今夕何夕(星期)
最新推荐文章于 2019-12-31 14:42:33 发布