#include #include #include #include class Date { public: Date(int new_year, int new_month, int new_day) { year = new_year; month = new_month; day = new_day; } bool IsLeap() const { bool flag = false; if (year % 4 == 0) { if (year % 100 != 0) { flag = true; } else { if (year % 400 == 0) { flag = true; } } } return flag; } std::string ToString() const { std::ostringstream os; os << std::setfill('0'); os << std::setw(2) << day << '.' << std::setw(2) << month << '.' << std::setw(4) << year; return os.str(); } Date DaysLater(int days) const { Date new_date(year, month, day); while (days > 0) { ++new_date.day; if ((new_date.month == 1 || new_date.month == 3 || new_date.month == 5 ||new_date.month == 7 || new_date.month == 8 || new_date.month == 10 || new_date.month == 12) && new_date.day > 31) { if (new_date.month == 12) { ++new_date.year; new_date.month = 1; } else { ++new_date.month; } new_date.day = 1; } else if (new_date.month == 2 && ((new_date.IsLeap() && new_date.day > 29) || (!new_date.IsLeap() && new_date.day > 28))) { ++new_date.month; new_date.day = 1; } else { if ((new_date.month == 4 || new_date.month == 6 || new_date.month == 9 || new_date.month == 11) && new_date.day > 30) { new_date.day = 1; ++new_date.month; } } --days; } return new_date; } int DaysLeft(const Date& date) { int a1 = (14 - date.month) / 12; int y1 = date.year + 4800 - a1; int m1 = date.month + 12 * a1 - 3; int jdn1 = date.day + (153 * m1 + 2) / 5 + (365 * y1) + (y1 / 4) - (y1 / 100) + (y1 / 400) - 32045; int a2 = (14 - month) / 12; int y2 = year + 4800 - a2; int m2 = month + 12 * a2 - 3; int jdn2 = day + (153 * m2 + 2) / 5 + (365 * y2) + (y2 / 4) - (y2 / 100) + (y2 / 400) - 32045; return abs(jdn2 - jdn1); } private: int year; int month; int day; };