您的位置:首页 > 编程语言

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

2015-11-01 21:32 330 查看
问题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;;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: