#include #include class Date { public: int day, month, year; explicit Date(int year, int month, int day) { this->day = day; this->month = month; this->year = year; } bool IsLeap() const { if (this->year % 100 == 0 && this->year % 400 != 0) return false; return this->year % 4 == 0; } std::string ToString() const { std::string day = this->day < 10 ? "0" + std::to_string(this->day) : std::to_string(this->day); std::string month = this->month < 10 ? "0" + std::to_string(this->month) : std::to_string(this->month); std::string year = std::to_string(this->year); if (this->year < 1000 && this->year > 99) year = "0" + std::to_string(this->year); if (this->year < 100 && this->year > 9) year = "00" + std::to_string(this->year); if (this->year < 10) year = "000" + std::to_string(this->year); return day + "." + month + "." + year; } Date DaysLater(int days) const { int m = this->month, d = this->day, y = this->year; int m2[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int i, k = 0, p, a; for (i = 0; i < m; i++) k = k + m2[i]; k = k + d + days; int day_in_year = IsLeap() ? 366 : 365; if (k <= day_in_year) { if (IsLeap()) m2[2] = 29; for (i = 0; i < 13; i++) { p = k - m2[i]; if (p <= m2[i + 1]) { a = i + 1; break; } else k = p; } return Date(y, a, p); } else { k = k - day_in_year; for (i = 0; i < 13; i++) { p = k - m2[i]; if (p <= m2[i + 1]) { a = i + 1; break; } else k = p; } return Date(y + 1, a, p); } } int DaysLeft(const Date& date) const { int m = this->month, d = this->day, y = this->year; if (m < 3) { y--; m += 12; } int fir = 365 * y + y / 4 - y / 100 + y / 400 + (153 * m - 457) / 5 + d - 306; int m1 = date.month, d1 = date.day, y1 = date.year; if (m1 < 3) { y1--; m1 += 12; } int sec = 365 * y1 + y1 / 4 - y1 / 100 + y1 / 400 + (153 * m1 - 457) / 5 + d1 - 306; return fir > sec ? fir - sec : sec - fir; } };