发布时间:2023-05-26 13:30
OpenJudge NOI 1.13 25:计算两个日期之间的天数
模拟日期变化,设函数判断一年是否是闰年,以及求某年某月的天数。
求从1-1-1到y-m-d的总天数(包括y-m-d这一天)
从1~y-1年,根据这一年是否是闰年求出这一年的天数,加和。
从1~m-1月,根据当前第y年是否是闰年求出这个月的天数,加和。
再加上d天,就是总天数。
分别对输入的两个日期,求这两个日期的总天数,第二个日期的总天数减去第一个日期的总天数,即为两个日期相差的天数。
设日期类,包括属性:y年,m月,d日。设置next方法,求当前日期的下一个日期。设!=(不等于)比较运算符(或者设函数也行),判断两个日期是否不同。
输入两个日期,得到两个日期对象。让起始日期不断变为自己的下一个日期,直到该日期与结束日期相同。在这个过程中做计数,得到两日期间相差的天数。
#include
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;
}
#include
using 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;
}