时间限制:1s 内存限制:32MB
题目描述
输入一个日期,要求输出该日期为星期几
输入样例
9 October 2001
14 October 2001
输出样例
Tuesday
Sunday
题目分析
1、日期类问题,先预处理出每个日期与原点日期(0年1月1日)之间的天数间隔,存入buf三维数组。
2、看到题目考虑两个问题:
①今天星期几?
②今天和给定日期相隔几天
3、int days = buf[y][m][d] - buf[2019][2][21]; //可能为负数
days += 4;
算出来的天数差可能是个负数,今天是星期四,对应数组下标为4,经此计算得到经过days天后的下标
代码
#include <stdio.h>
#include <string.h>
#define ISYEAR(x) x%100 != 0 && x%4 == 0 || x%400 == 0 ? 1 : 0
int dayOfMonth[13][2] = {
0, 0,
31, 31,
28, 29,
31, 31,
30, 30,
31, 31,
30, 30,
31, 31,
31, 31,
30, 30,
31, 31,
30, 30,
31, 31
};
struct Date{
int Day;
int Month;
int Year;
void nextDay(){
Day++;
if(Day > dayOfMonth[Month][ISYEAR(Year)]){
Day = 1;
Month++;
if(Month > 12){
Month = 1;
Year++;
}
}
}
};
int buf[3001][13][32]; //预处理,存储每一天与原点日期的天数差
char monthName[13][20] = {
"",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
}; // 月名 每个月对应下标1-12
char weekName[7][20]={
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
}; //周名 每个周对应下标0-6
int main(){
Date tmp;
int cnt = 0;
tmp.Day = 1;
tmp.Month = 1;
tmp.Year = 0;
while(tmp.Year != 3001){
buf[tmp.Year][tmp.Month][tmp.Day] = cnt;
tmp.nextDay();
cnt++;
}// 预处理出每一天与原点日期的天数差
int d, m, y;
char s[20];
while(scanf("%d%s%d", &d, s, &y) != EOF){
for(m = 1; m <= 12; m++){
if(strcmp(s, monthName[m]) == 0){
break; //将输入的字符与月名比较,得出月数
}
}
int days = buf[y][m][d] - buf[2019][2][21]; //可能为负数
days += 4; // 2019/2/21今天为星期四,对应下标为4,得到目标日期的下标
puts(weekName[(days%7+7)%7]);
}
return 0;
}