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

来源:互联网 发布:avi播放器 for mac 编辑:程序博客网 时间:2024/04/29 11:37

问题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;elsesign = true;if(sign){int gap = distance(standard,s);return gap % 7;}else{int gap = distance(s,standard);return -(gap % 7) + 7;;}}



0 0
原创粉丝点击