问题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;; } }