#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
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;
};