题目描述
假设日期1969.01.01用0表示,请开发一个函数输出Í任意日期的整数表示(日期小于1969.01.01的用负数表示)。反过来,给定日期的整数表示,开发一个函数求日期对应的年月日。
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
using namespace std;
int months[13] = {
0, 31, 28, 31, 30, 31, 30, 31, 31,
30, 31, 30, 31
};
//判断当前年份是否为闰年,返回值位int类型,原因见get_days函数中的用法。
int is_leap(int year)
{
return year % 4 == 0 && year % 100 || year % 400 == 0;
}
//获取某年某月有多少天的天数。
int get_days(int year, int month)
{
int s = months[month];
if (month == 2) return s + is_leap(year);
return s;
}
//date_to_day函数
//输入:给定的一个标准格式的日期
//输出:给定日期距离当前日期的天数
int date_to_day(string date) {
int dd[3];
int index = 0;
//解析字符串,提取日期对应的年月日
for (int i = 0; i < date.size(); i ++) {
int j = i;
while (j < date.size() && date[j] != '.') j ++;
int t = 0;
for (int k = i; k < j; k ++) {
t = t * 10 + (date[k] - '0');
}
dd[index ++] = t;
i = j;
}
int year = dd[0], month = dd[1], day = dd[2];
int res = 0;
if (year < 1969) {
//若日期为在1969年之前,则从当前时间计算到1969年1月1日总共多少天
while (year < 1969 || month != 1 || day != 1) {
day ++, res ++;
if (day > get_days(year, month)) {
day = 1;
month ++;
if (month > 12) {
month = 1;
year ++;
}
}
}
res = -1 * res;
} else {
//若日期为在1969年之后,则从1969年1月1日到当前时间总共多少天
int i = 1969, j = 1, k = 1;
while (i < year || j < month || k < day) {
k ++, res ++;
if (k > get_days(i, j)) {
k = 1;
j ++;
if (j > 12) {
j = 1;
i ++;
}
}
}
}
return res;
}
string day_to_date(int day) {
//从1969年开始累加日期
int y = 1969, m = 1, d = 1;
while (day != 0) {
if (day > 0) {
day --;
d ++;
if (d > get_days(y, m)) {
d = 1;
m ++;
if (m > 12) {
y ++;
m = 1;
}
}
} else {
day ++;
d --;
if (d < 1) {
m --;
if (m < 1) {
y --;
m = 12;
}
d = get_days(y, m);
}
}
}
string res = to_string(y) + '.' + to_string(m) + '.' + to_string(d);
return res;
}
int main() {
string date = "2020.01.01";
cout << date_to_day(date) << endl;
cout << day_to_date(date_to_day("1378.09.25")) << endl;
return 0;
}
csp2020 s2 T1儒略日有救了