题解 | #日期差值#

日期差值

https://www.nowcoder.com/practice/ccb7383c76fc48d2bbc27a2a6319631c

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Date {
    friend ostream& operator<<(ostream& out, const Date& d);
    friend istream& operator >> (istream& in, Date& d);
  public://d2(d1) d2.Date(d1)
    int GetMouthDay(int year, int mouth) {
        static int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        int day = days[mouth];
        if (mouth == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) {
            day += 1;
        }
        return day;
    }
    Date()
    {}
    Date(int year, int mouth, int day) {
        this->_year = year;
        this->_mouth = mouth;
        this->_day = day;
    }
    void Print() {
        cout << _year << this->_mouth << this->_day;
    }
    //d1>d2--->!(d1<=d2)
    bool operator>(const Date& d) {
        return !(*this <= d);
    }
    bool operator>=(const Date& d) {
        return !(*this < d);
    }
    bool operator==(const Date& d) {
        if (this->_year == d._day && this->_mouth == d._mouth && this->_day == d._day) {
            return true;
        }
        return false;
    }
    bool operator!=(const Date& d) {
        return !(*this == d);
    }
    //d1<d2
    //d1.operator<(&d1,d2)
    inline bool operator<(const Date& d) {
        if (this->_year < d._year) {
            return true;
        } else if (this->_year == d._year && _mouth < d._mouth) {
            return true;
        } else if (_year == d._year && _mouth == d._mouth && _day < d._day) {
            return true;
        }
        return false;

    }
    bool operator <= (const Date& d) {
        return *this < d || *this == d;
    }
    //d1+=10
    Date& operator += (int day) {
        this->_day += day;
        while (_day > GetMouthDay(this->_year, this->_mouth)) {
            _day -= GetMouthDay(this->_year, this->_mouth);
            _mouth++;
            if (_mouth == 13) {
                ++_year;
                _mouth = 1;
            }
        }
        return *this;
    }
    Date operator+(int day) {
        Date ret(*this);
        ret += day;//ret.operator+=(day);
        return ret;
    }
    //d1+=10----d1.operator(&d1,10)
    Date& operator-=(int day) {
        this->_day -= day;
        while (this->_day <= 0) {
            this->_mouth--;
            if (_mouth == 0) {
                --_year;
                _mouth = 12;
            }
            this->_day += GetMouthDay(_year, _mouth);
        }
        return *this;
    }
    Date operator-(int day) {
        Date ret = *this;
        ret._day -= day;
        while (ret._day <= 0) {
            ret._mouth--;
            if (ret._mouth == 0) {
                --ret._year;
                ret._mouth = 12;
            }
            ret._day += GetMouthDay(ret._year, ret._mouth);
        }
        return ret;
    }
    //++d1--->d1.operator++(&d1)
    Date& operator++() {
        *this += 1;
        return *this;//返回加之后的值
    }
    //d1++--->d1.operator++(&d1,0)
    Date operator++(int) {
        Date tmp(*this);
        *this += 1;
        return tmp;
    }

    //d1-d2  利用n返回d1和d2所相差的天数
    int operator-(const Date& d) {
        int flag = 1;
        Date max = *this;//拷贝构造---浅拷贝---编译器可以自动生成
        Date min = d;
        if (*this < d) {
            max = d;
            min = *this;
            flag = -1;
        }
        int n = 0;
        while (min != max && min < max) {
            ++min;
            ++n;
        }
        return n + 1;
    }
    void Scanf() {
        scanf("%04d%02d%02d", &this->_year, &this->_mouth, &this->_day);
    }
    ////cour->ostream
    ////cin->istream

  private:
    int _year;
    int _mouth;
    int _day;
};
ostream& operator<<(ostream& out, const Date& d) {
    out << d._year << d._mouth << d._day << endl;
    return out;
}
istream& operator >> (istream& in, Date& d) {
    in >>  d._year >> d._mouth >> d._day;
    return in;
}

int main() {
    /*Date d1(0, 1, 1);
    Date d2(0, 1, 1);*/
    /*Date d1(2022,2,10);
    Date d2(2022, 2, 1);*/
    //cin >> d1 >> d2;
    /*while (cin>>d1>>d2)
    {
        cout << d1 << d2;
    }*/
    Date d1, d2;//&& d2.Scanf()
    /*while (cin>>d1>>d2) {
        cout << d1 - d2;
    }*/
    d1.Scanf();
    d2.Scanf();
    /* cout << d1<<endl;
     cout << d2<<endl;*/
    cout << d1 - d2;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务