//1、 假设日期 1969.01.01 用 0 表示, 请开发一个函数输出任意日期的整数表示(日期小于
//1969.01.01 的用负数表示)。 反过来, 给定日期的整数表示, 开发一个函数求日期对应的年//月日。
//判断是否是平年,平年365,闰年366
inline bool isPy(int y) {
if ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0))return false;
else return true;
}
void getZhengDays(int& days, int y, int m, int d) {
for (int i = 1969; i < y; i++) {
if (isPy(i))days += 365;
else days += 366;
}
for (int i = 1; i < m; i++) {
switch (i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: {days += 31; break; }
case 4:
case 6:
case 9:
case 11: {days += 30; break; }
default: {if (isPy(y))days += 28;
else days += 29; }
break;
}
}
days += d - 1;
}
void getFuDays(int& days, int y, int m, int d) {
for (int i = y + 1; i < 1969; i++) {
if (isPy(i))days += 365;
else days += 366;
}
int tempDays = 0;
for (int i = 1; i < m; i++) {
switch (i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: {tempDays += 31; break; }
case 4:
case 6:
case 9:
case 11: {tempDays += 30; break; }
default: {if (isPy(y))tempDays += 28;
else tempDays += 29; }
break;
}
}
if (isPy(y))days += (365 - tempDays - d);
else days += (366 - tempDays - d);
days = -days - 1;
}
void D2Zhengshu() {
int y, m, d;
cout << "根据输入的日期得到其整数表示,日期 1969.01.01 用 0 表示" << endl;
cout << "输入的日期格式为y m d" << endl;
cout << "请输入日期:";
while (cin >> y >> m >> d) {
if (m < 1 || m>12 || d < 1 || d>31)cout << "输入日期有误,请重新输入!" << endl;
else break;
}
int days = 0;
if (y >= 1969) {//得到正整数
getZhengDays(days, y, m, d);
}
else {//得到负整数
getFuDays(days, y, m, d);
}
cout << days << endl;
}
void Zhengshu2D() {
int zhengShu;
cout << "根据输入的得到对应的日期,日期用 y/m/d 表示" << endl;
cout << "请输入整数:";
cin >> zhengShu;
int y = 1969, m = 1, d = 1;
unordered_mapmp = {
{1,31},
{2,29},
{3,31},
{5,31},
{7,31},
{8,31},
{10,31},
{12,31},
{4,30},
{6,30},
{9,30},
{11,30}
};
if (zhengShu > 0) {
while (zhengShu >= 365) {
y += 1;
if (isPy(y))zhengShu -= 365;
else zhengShu -= 366;
}
if (zhengShu < 0) {
zhengShu += 366;
y--;
}
while (zhengShu) {
int md = mp[m];
if (isPy(y) && m == 2)md = md - 1;
zhengShu -= md;
if (zhengShu < 0) {
zhengShu += md;
break;
}
m++;
if (m != 2 && zhengShu <= mp[m])break;
}
if (!isPy(y))zhengShu++;
d += zhengShu;
}
else if (zhengShu == 0) {
y = 1969, m = 1, d = 1;
}
else {
zhengShu = -zhengShu;
while (zhengShu >= 365) {
y -= 1;
if (isPy(y))zhengShu -= 365;
else zhengShu -= 366;
}
if (zhengShu <= 0) {
zhengShu += 366;
y++;
}
y--;
if (isPy(y))zhengShu = 365 - zhengShu;
else zhengShu = 366 - zhengShu;
while (zhengShu) {
int md = mp[m];
if (isPy(y) && m == 2)md = md - 1;
zhengShu -= md;
if (zhengShu < 0) {
zhengShu += md;
break;
}
m++;
if (m != 2 && zhengShu <= mp[m])break;
}
//if (!isPy(y))zhengShu--;
d += zhengShu;
}
cout << to_string(y) + "/" + to_string(m) + "/" + to_string(d) << endl;
}
int main() {
//由日期得到整数
D2Zhengshu();
//由整数得到日期
Zhengshu2D();
return 0;
}



