题解 | #日期差值#
日期差值
https://www.nowcoder.com/practice/ccb7383c76fc48d2bbc27a2a6319631c
#include <algorithm>
#include <climits>
#include <cstdio>
#include <iostream>
using namespace std;
class Date
{
public:
//构造函数
Date(int year=1,int month=1,int day=1)
:_year(year)
,_month(month)
,_day(day)
{}
//获取每个月的天数
static int Getmonth(int year, int month, int day)
{
static int GetMonth[13] = { -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//判断是不是闰年
if ((month == 2) && ((year % 400 == 0) || ((year % 100 != 0 && year % 4 == 0))))
{
return 29;
}
return GetMonth[month];
}
//比较是否相等
bool operator==(const Date& d)
{
return _year==d._year &&_month==d._month && _day==d._day;
}
//比较是否相等
bool operator!=(const Date& d)
{
return !(*this==d);
}
//日期的比较
bool operator<(const Date& d)
{
if (_year < d._year)
{
return true;
}
else if (_year==d._year && _month < d._month)
{
return true;
}
else if (_year==d._year && _month == d._month && _day < d._day)
{
return true;
}
return false;
}
//日期的加法
Date& operator+=(int day)
{
_day+=day;
while (_day>this->Getmonth( _year, _month, _day))
{
_day-=Getmonth( _year, _month, _day);
++_month;
if (_month>12)
{
++_year;
_month = 1;
}
}
return *this;
}
//日期之间的差值
int operator-(const Date& d)const
{
Date max = *this;
Date min = d;
if (max < min)
{
min = *this;
max = d;
}
int count=1;
while (max != min)
{
min+=1;
++count;
}
return count;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
int year1;int month1;int day1;
int year2;int month2;int day2;
//cin >> year1 >> month1 >> day1;
//cin >> year2 >> month2 >> day2;
scanf("%4d%2d%2d",&year1,&month1,&day1);
scanf("%4d%2d%2d",&year2,&month2,&day2);
Date A(year1,month1,day1);
Date B(year2,month2,day2);
int ret=A-B;
cout<<ret;
return 0;
}
https://blog.csdn.net/Jason_from_China/article/details/142516352
这里本质就是一个日期类的实现,可以看一下我写的日期类的博客,我这里把需要的代码拷贝一下没有做过多逻辑操作
这里需要注意两个点:
1,输入格式的问题,牛客这里是直接输入一大串连续的数值,所以需要你自己区分开
2,每个人对于日期的差值的理解是不一样的,就像我会认为是22-11就是10天差值,但是牛客会认为差值是11天
3,正规来说需要写一个输入流和输出流,但是我觉得麻烦也不想改太多,所以直接采取scanf单个输入的方式进行输入
查看12道真题和解析