type1:实现某年某月某日往前或往后N天后日历的输出。
type2:实现两个日期之间相差天数的计算。
#include <iostream>
using namespace std;
int monthDays[] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
class Cdata{
public:
int year, month, day;
public:
inline bool isrun(const int year) {
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
return true;
} else {
return false;
}
}
int calculate1(int iyear, int imonth, int iday, int distance = 0) {
year = 1840;
for(int y = 1840; y < iyear; ++y) {
if(isrun(y)) {
distance += 366;
} else {
distance += 365;
}
}
if(isrun(iyear)) {
monthDays[2] = 29;
} else {
monthDays[2] = 28;
}
for(int m = 1; m < imonth; ++m) {
distance += monthDays[m];
}
distance += iday;
int res = distance;
while(true) {
if(isrun(year)) { // calculate year
if(distance <= 366) {
break;
} else {
distance -= 366;
++year;
}
} else {
if(distance <= 365) {
break;
} else {
distance -= 365;
++year;
}
}
}
for(int m = 1; m < 13; ++m) { // calculate month
if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
if(distance <= 31) {
break;
}
}else if(m == 4 || m == 6 || m == 9 || m == 11) {
if(distance <= 30) {
break;
}
} else if(m == 2) {
if(isrun(year)) {
monthDays[2] = 29;
} else {
monthDays[2] = 28;
}
if(distance <= monthDays[2]) {
break;
}
}
distance -= monthDays[m];
++month;
}
day = distance;
return res;
}
int calculate2(int& year1, int& month1, int& day1, int& year2, int& month2, int& day2) {
int res1 = calculate1(year1, month1, day1);
int res2 = calculate1(year2, month2, day2);
return res2 - res1;
}
};
int main() {
int type, y1, m1, d1, y2, m2, d2, dis;
Cdata a;
cin >> type;
while(1) {
if(type == 1) {
cin >> y1 >> m1 >> d1 >> dis;
a.calculate1(y1, m1, d1, dis);
cout << "year: " << a.year << endl
<< "month: " << a.month << endl
<< "day: " << a.day << endl;
} else if(type == 2) {
cin >> y1 >> m1 >> d1 >> y2 >> m2 >> d2;
cout << a.calculate2(y1, m1, d1, y2, m2, d2) << endl;
}
}
return 0;
}