编程珠玑第三章—习题4(日期问题)

问题1:给定两个日期,计算两者之间的天数。

解答:可以现将月和日换算成该年的第多少天,用后者减去前者,然后年份差距乘以365,同时考虑到两个年份之间闰年的个数,如果闰年个数为n,则最后结果再加上n.

#include <iostream>

typedef struct{
	int year;
	int month;
	int day;
}date;

//日期在相应年份中的编号
int transform(date s)
{
	bool leap = (s.year % 4 == 0 && s.year %100) || !(s.year % 400);
	int months[13] = {0,30,28,31,30,31,30,31,31,30,31,30,31};
	int sequence, addNum;
	sequence = addNum = 0;
	for(int i = 0; i < s.month; ++i)
		sequence += months[i];
	sequence += s.day;
	//如果是闰年,且月份在2月份以后,则编号加1,因为2月实际多一天
	if(leap)
		addNum = s.month < 3 ? 0 : 1;
	return sequence+addNum;
}

//统计两年间闰年个数
int numOfLeap(date s1, date s2)
{
	int num = 0;
	for(int year = s1.year; year < s2.year; ++year)
	{
		if((year % 4 == 0 && year % 100) || !(year % 400))
			++num;
	}
	return num;
}

int distance(date s1, date s2)
{
	//编号差距+年份差距*365+闰年个数
	return transform(s2)-transform(s1)+(s2.year-s1.year)*365+numOfLeap(s1, s2);
}

//测试
 int main()
 {
	 date s1, s2;
	 s1.year = 2010;
	 s1.month = 3;
	 s1.day = 30;
	 s2.year = 2015;
	 s2.month = 4;
	 s2.day = 1;
	 std::cout << distance(s1, s2) << std::endl;
	 //getchar();
	 return 0;
 }

问题2:给定一个日期,返回值为周几

解答:以一个已知为周几的日期为参照,计算两者之间的天数,结果模7即可得到周几。

//给定日期,返回周几
int week(date s)
{
	//以2015年11月1日为参照,该天为周日
	date standard;
	standard.year = 2015;
	standard.month = 11;
	standard.day = 1;
	//判断要计算的日期在标准日期之前还是之后
	bool sign;
	if(s.year < 2015)
		sign = false;
	else if(s.year == 2015 && s.month < 11)
		sign = false;
	else
		sign = true;
	if(sign)
	{
		int gap = distance(standard,s);
		return gap % 7;
	}
	else
	{
		int gap = distance(s,standard);
		return -(gap % 7) + 7;;
	}
}



你可能感兴趣的:(编程珠玑第三章—习题4(日期问题))