int Date(int y,int m,int d)
{
if(m==1||m==2)
{
m+=12;
y--;
}
int week = (d + 2*m +3*(m+1)/5 + y + y/4 - y/100 + y/400)%7+1;
return week;
}
1-7代表周一至周日。
hdu 6112:
挺简单的。不过wa了一发。因为最开始忘记了2月29日不是每年都有的。
AC代码:
#include<iostream>
using namespace std;
int Date(int y,int m,int d)
{
if(m==1||m==2)
{
m+=12;
y--;
}
int week = (d + 2*m +3*(m+1)/5 + y + y/4 - y/100 + y/400)%7+1;
return week;
}
//不是闰年返回true
bool f(int y)
{
if((y%4==0&&y%100!=0)||y%400==0)return false;
else return true;
}
int main()
{
int y,m,d;
int T;
cin>>T;
while(T--)
{
//scanf("%4d%c%2d%c%2d",&y,&c,&m,&c,&d); 另一种写法
scanf("%d-%d-%d",&y,&m,&d);
int week=Date(y,m,d);
for(y=y+1;; y++)
{
//日期是2月29,y不是闰年
if(m==2&&d==29&&f(y))
{
continue;
}
if(Date(y,m,d)==week)
{
break;
}
}
printf("%d\n",y);
}
return 0;
}