题目链接http://ac.jobdu.com/problem.php?pid=1096
在这种日期类的问题中,有一个通用的方法,就是打表,记录每一个日期到0年1月1日的距离天数,之后要求什么,我们通过这个表进行相应的变化即可!!
#include <cstdio> #include <cstring> #include <string> #include <iostream> #include <algorithm> #include <stack> #include <queue> #include <map> #include <vector> #include <cmath> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; const int maxn = 5555; int day[maxn][13][32]; //代表年月日 int dayy = 1; //统计量 bool is_leap(int yearr) { if ((yearr % 4 == 0 && yearr % 100 != 0) || (yearr % 400 == 0)) return true; else return false; } int mon[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, }; class date //class中成员默认为私有的private { public: date() {} void getday() { int year = 0, month = 1, day1 = 1; while (year<5000) { day[year][month][day1] = dayy++; //最外层一个统计量 day1++; if (day1>mon[month][is_leap(year)]) { day1 = 1; month++; if (month>12) //一层一层走 { month = 1; year++; } } } } }; int main(void) { //freopen("in.txt", "r", stdin); int year1, month1, day1, year2, month2, day2; date datee; datee.getday(); //调用这个方法 while (scanf("%4d%2d%2d", &year1, &month1, &day1) != EOF) //这个读入方法很好 { scanf("%4d%2d%2d", &year2, &month2, &day2); int ans = abs((day[year1][month1][day1] - day[year2][month2][day2])) + 1; //人家说了,相邻日期算隔俩天 //用上绝对值,不一定谁大谁小 printf("%d\n", ans); } return 0; } //得到与第一天的差是关键!!这是日期类问题的关键!!