#include class Date { public: Date(int year, int month, int day) { this->year = year; if (this->year % 4 || (this->year % 100 == 0 && this->year % 400)) { this->leapy = false; } else { this->leapy = true; } this->month = month; this->day = day; } bool IsLeap() const { return this->leapy; } std::string ToString() const { std::string d, m, y, result; d = std::to_string(this->day); if (this->day < 10) d = '0' + d; m = std::to_string(this->month); if (this->month < 10) m = '0' + m; y = std::to_string(this->year); if (this->year < 1000 && this->year > 99) y = '0' + y; if (this->year < 100 && this->year > 9) y = "00" + y; if (this->year < 10 && this->year > 0) y = "000" + y; result = d + "." + m + "." + y; return result; } Date DaysLater(int days) const { int days_mas[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int day = this->day, month = this->month, year = this->year; if (leapy) { days_mas[1] = 29; } while (days > 0) { if (leapy) { if (days > 366) { year++; days -= 366; } else { while (days > 31) { days -= days_mas[month - 1]; month++; if (month == 13) { month = 1; year++; if (year % 4 || (year % 100 == 0 && year % 400)) days_mas[1] = 28; else days_mas[1] = 29; } } day += days; if (day > days_mas[month - 1]) { day -= days_mas[month - 1]; month++; if (month == 13) { month = 1; year++; } } days = 0; } } else { if (days > 365) { year++; days -= 365; } else { while (days > 31) { days -= days_mas[month - 1]; month++; if (month == 13) { month = 1; year++; if (year % 4 || (year % 100 == 0 && year % 400)) days_mas[1] = 28; else days_mas[1] = 29; } } day += days; if (day > days_mas[month - 1]) { day -= days_mas[month - 1]; month++; if (month == 13) { month = 1; year++; } } days = 0; } } } return Date(year, month, day); } int DaysLeft(const Date& date) const { int days[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (leapy) days[1] = 29; int days_result, yd, d_zero, md_current = 0, md_future = 0; yd = date.year - this->year; d_zero = yd / 4; if (leapy) days_result = yd * 366; else days_result = yd * 365; days_result += d_zero; for (int i = 0; i < this->month - 1; ++i) md_current += days[i]; for (int i = 0; i < date.month - 1; ++i) md_future += days[i]; days_result = days_result - md_current + md_future + (date.day - this->day < 0 ? this->day - date.day : date.day - this->day); return days_result; } private: int year, month, day; bool leapy; };