OpenJudge NOI 1.13 25:计算两个日期之间的天数
【题目考点】 1. 模拟 【解题思路】模拟日期变化,设函数判断一年是否是闰年,以及求某年某月的天数。
解法1:求总天数求从1-1-1到y-m-d的总天数(包括y-m-d这一天)
从1~y-1年,根据这一年是否是闰年求出这一年的天数,加和。
从1~m-1月,根据当前第y年是否是闰年求出这个月的天数,加和。
再加上d天,就是总天数。
分别对输入的两个日期,求这两个日期的总天数,第二个日期的总天数减去第一个日期的总天数,即为两个日期相差的天数。
设日期类,包括属性:y年,m月,d日。设置next方法,求当前日期的下一个日期。设!=(不等于)比较运算符(或者设函数也行),判断两个日期是否不同。
输入两个日期,得到两个日期对象。让起始日期不断变为自己的下一个日期,直到该日期与结束日期相同。在这个过程中做计数,得到两日期间相差的天数。
#include解法2:推导下一个日期using namespace std; bool isLeap(int y) { return y%400 == 0 || y%100 != 0 && y%4 == 0; } int getDays(int y, int m, int d)//求从1.1.1~y.m.d的总天数,包括y.m.d这一天 { int td = 0; for(int i = 1; i < y; ++i) td += isLeap(i) ? 366 : 365; for(int i = 1; i < m; ++i) { if(i == 2) td += isLeap(y) ? 29 : 28; else if(i == 4 || i == 6 || i == 9 || i == 11) td += 30; else td += 31; } td += d; return td; } int main() { int y1, m1, d1, y2, m2, d2, td1, td2; cin >> y1 >> m1 >> d1 >> y2 >> m2 >> d2; td1 = getDays(y1, m1, d1); td2 = getDays(y2, m2, d2); cout << td2 - td1; return 0; }
#includeusing namespace std; struct Date { int y, m, d;//年,月,日 bool isLeap() { return y%400 == 0 || y%100 != 0 && y%4 == 0; } int getMonthDay() { if(m == 2) return isLeap() ? 29 : 28; else if(m == 4 || m == 6 || m == 9 || m == 11) return 30; else return 31; } void nextDay()//自己变为下一个日期 { d++; if(d > getMonthDay()) { d = 1; m++; if(m > 12) { m = 1; y++; } } } bool operator != (Date b)//判断自己是否与b不同 { return y != b.y || m != b.m || d != b.d; } }; int main() { int ct = 0;//计数,相差天数 Date a, b; cin >> a.y >> a.m >> a.d >> b.y >> b.m >> b.d; while(a != b) { ct++; a.nextDay(); } cout << ct; return 0; }



