#include <string>
#include <sstream>
class Date {
public:
Date(int year, int month, int day) {
date_year = year;
date_month = month;
date_day = day;
}
bool IsLeap() const {
return (((date_year) % 4) == 0 && \
(((date_year) % 100) != 0 || ((date_year) % 400) == 0));
}
std::string ToString() const {
std::string string_day = std::to_string(date_day);
std::string string_month = std::to_string(date_month);
std::string string_year = std::to_string(date_year);
for (unsigned int i = 0; i < 2 - string_day.length(); i++) {
string_day.insert(0, "0");
}
for (unsigned int i = 0; i < 2 - string_month.length(); i++) {
string_month.insert(0, "0");
}
while (string_year.length() != 4) {
string_year.insert(0, "0");
}
std::stringstream date;
date << string_day << "." << string_month << "." << string_year;
return date.str();
}
Date DaysLater(int days) const {
int year = date_year;
int day = date_day;
int month = date_month;
int no_leap[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int leap[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
while (days != 0) {
day++;
if (IsLeap()) {
if (day > leap[month - 1]) {
day = 1;
month++;
}
} else if (day > no_leap[month - 1]) {
day = 1;
month++;
}
if (month > 12) {
month = 1;
year++;
}
days--;
}
Date date(year, month, day);
return date;
}
int DaysLeft(const Date & date) const {
int year = date_year;
int day = date_day;
int month = date_month;
int no_leap[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int leap[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int counter = 0;
while ((year != date.date_year) || (month != date.date_month) ||
(day != date.date_day)) {
day++;
counter++;
if (IsLeap()) {
if (day > leap[month]) {
day = 1;
month++;
}
} else if (day > no_leap[month]) {
day = 1;
month++;
}
if (month > 12) {
month = 1;
year++;
}
}
return counter;
}
private:
int date_year;
int date_month;
int date_day;
};