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