九度_1096(日期差值)

题目链接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;
}
//得到与第一天的差是关键!!这是日期类问题的关键!!


你可能感兴趣的:(九度)