算法提高 日期计算
时间限制:1.0s 内存限制:256.0MB
问题描述
已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
输入格式
输入只有一行
YYYY MM DD
输出格式
输出只有一行
W
数据规模和约定
1599 <= YYYY <= 2999
1 <= MM <= 12
1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
1 <= W <= 7,分别代表周一到周日
样例输入
2011 11 11
样例输出
5
#include <stdio.h>
int days_of_month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int forward_mod_to_week[] = {5, 6, 7, 1, 2, 3, 4};
int backward_mod_to_week[] = {5, 4, 3, 2, 1, 7, 6};
int is_leap_year(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
return 1;
else
return 0;
}
int main()
{
int year, month, day;
scanf("%d %d %d", &year, &month, &day);
if (year > 2011)
{
int gap = 50;
for (int y = 2012; y < year; ++y)
{
if (is_leap_year(y))
gap += 366;
else
gap += 365;
}
for (int m = 1; m < month; ++m)
{
gap += days_of_month[m];
if (m == 2 && is_leap_year(year))
gap++;
}
gap += day;
printf("%d", forward_mod_to_week[gap % 7]);
}
else if (year < 2011)
{
int gap = 342;
for (int y = 2010; y > year; --y)
{
if (is_leap_year(y))
gap += 366;
else
gap += 365;
}
for (int m = 12; m > month; --m)
{
gap += days_of_month[m];
if (m == 2 && is_leap_year(year))
gap++;
}
if (month != 2)
gap += days_of_month[month] - day + 1;
else
{
if (is_leap_year(year))
gap += 29 - day + 1;
else
gap += 28 - day + 1;
}
printf("%d", backward_mod_to_week[gap % 7]);
}
else
{
if (month > 11)
{
int gap = 19;
gap += day;
printf("%d", forward_mod_to_week[gap % 7]);
}
else if (month < 11)
{
int gap = 10;
for (int m = 10; m > month; --m)
{
gap += days_of_month[m];
if (m == 2 && is_leap_year(year))
gap++;
}
gap += days_of_month[month] - day + 1;
printf("%d", backward_mod_to_week[gap % 7]);
}
else
{
if (day >= 11)
{
int gap = day - 11;
printf("%d", forward_mod_to_week[gap % 7]);
}
else
{
int gap = 11 - day;
printf("%d", backward_mod_to_week[gap % 7]);
}
}
}
return 0;
}