日期类题目:
1、写好年月日的结构体
2、可以用宏来判断是否是闰年,闰年的条件:可以被4整除且不能被100整除或者可以被400整除 记得灵活运用宏哦
3、日期类题目一般解题思维是求一个日期与另一个固定日期之间的规律从而解题,这里我们可以运用哈希的思想,设置一个三维数组,记录与0年1月1日之间的间隔,也就是天数。
不过三维数组空间复杂度很高,要设置为全局变量。在加天数的同时也要记得判断计数器记录的下一天是不是已经超过这个月或者这年了,从而做出++month或者++year的操作。
#include<algorithm> #include<string.h> #include<iostream> #include<stdio.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 }; char monthName[13][20] = { "", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; char weekName[7][20] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; 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[5001][13][32]; /*int Abs(int x) { return x < 0 ? -x : x; }*/ int main() { Date tmp; int cnt = 0; tmp.Day = 1; tmp.Month = 1; tmp.Year = 0; while (tmp.Year != 5001) { buf[tmp.Year][tmp.Month][tmp.Day] = cnt; //记录该日与0年1月1日的天数差保存起来 tmp.nextDay(); cnt++; //计数器累加,每经过一天计数器即+1,代表与原点日期的间隔又增加一天 } int d1, y1; char s[20]; int i; while (std::cin>>d1>>s>>y1) { for (i=1; i < 13; i++) { if (strcmp(s, monthName[i]) == 0) break; } if (i == 13) { std::cout << "wrong input"; continue; } int days = buf[y1][i][d1] - buf[2021][3][1] + 1; //这里注意 不能直接用绝对值再加一 2021 3.1日是周一 2.28则是周一 相差天数为一天 如果用绝对值的话 +1相差天数为两天 %7后就变成周一了 所以正确应该是 相减为-1再+1=0%7=0为周日 printf("%s", weekName[(days%7+7)%7]); } return 0; }