DreamJudge-1290-日期差值
1.题目介绍
题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入输出格式
输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出描述:
每组数据输出一行,即日期差值
输入输出样例
输入样例#:
20110412
20110422
输出样例#:
11
题目来源
上海交通大学/西北工业大学2019机试
2.题解
2.1 打表 + 日期计算1
思路
这里还是采用和1011.日期 一样的思路
将base年份剩余天数,补充到cur年份缺少的天数中
然后跳过base年份,计算后面所有年份的天数,并考虑差值即可
代码
#include<bits/stdc++.h>
using namespace std;
vector<int> f{0,31,28,31,30,31,30,31,31,30,31,30,31};
class Date{
public:
int year;
int month;
int day;
Date(string datestr){
this->year = stoi(datestr.substr(0, 4));
this->month = stoi(datestr.substr(4, 2));
this->day = stoi(datestr.substr(6, 2));
}
Date(int y, int m, int d): year(y), month(m), day(d){};
};
bool isLeapYear(int y){
if(y % 400 == 0 || y % 4 == 0 && y % 100 != 0) return true;
return false;
}
// 获得当前年份到年末剩余天数
int getRemainDay(Date date){
f[2] = isLeapYear(date.year)?29:28;
int diff_m = 12 - date.month;
int diff_d = f[date.month] - date.day;
for(int i = 1; i <= diff_m; i++){
diff_d += f[date.month + i];
}
return diff_d;
}
// 获取相隔天数
int getDifferDay(Date base_date, Date cur_date){
int remain_baseday = getRemainDay(base_date);
int need_curday = getRemainDay(cur_date);
int diff_y = cur_date.year - base_date.year;
int diff_d = remain_baseday - need_curday; //注意这里不要写反了, remain_baseday是补充的,need_curday是缺少的!!!
for(int i = 1; i <= diff_y; i++){
int year = base_date.year + i;
diff_d += isLeapYear(i) ? 366 : 365; // 考虑到闰年情况;
}
return diff_d;
}
int main(){
// 用scanf读取非常方便的
//int y1, m1, d1;
//int y2, m2, d2;
//scanf("%4d%2d%2d",&y1,&m1,&d1);
//scanf("%4d%2d%2d",&y2,&m2,&d2);
//Date base_date(y1, m1, d1);
//Date cur_date(y2, m2, d2);
string base_datestr, cur_datestr;
cin >> base_datestr >> cur_datestr;
Date base_date(base_datestr);
Date cur_date(cur_datestr);
cout << getDifferDay(base_date, cur_date) + 1; // 加上今天当天的日期
return 0;
}
2.2 打表 + 日期计算2
思路
这里的思路是找一个基准点——公元元年
这样的话我们可以利用(cur_date - 公元元年) - (base_date - 公元元年) = 相差天数
代码
#include <bits/stdc++.h>
using namespace std;
vector<int> f{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
class Date {
public:
int year;
int month;
int day;
Date(string datestr) {
year = stoi(datestr.substr(0, 4));
month = stoi(datestr.substr(4, 2));
day = stoi(datestr.substr(6, 2));
}
};
bool isLeapYear(int y) {
return (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0);
}
// 计算从年初到给定日期的天数
int daysInYear(int year, int month, int day) {
int days = 0;
vector<int> monthDays = f;
if (isLeapYear(year)) {
monthDays[2] = 29;
}
for (int i = 1; i < month; ++i) {
days += monthDays[i];
}
days += day;
return days;
}
// 计算公元元年当前日期的总天数
int daysSinceEpoch(Date date) {
int days = 0;
for (int i = 1; i < date.year; ++i) {
days += isLeapYear(i) ? 366 : 365;
}
days += daysInYear(date.year, date.month, date.day);
return days;
}
// 计算日期差值
int daysBetweenDates(Date date1, Date date2) {
int totalDays1 = daysSinceEpoch(date1);
int totalDays2 = daysSinceEpoch(date2);
return abs(totalDays2 - totalDays1);
}
int main() {
string base_datestr, cur_datestr;
cin >> base_datestr >> cur_datestr;
Date base_date(base_datestr);
Date cur_date(cur_datestr);
int diff_d = daysBetweenDates(base_date, cur_date);
cout << diff_d + 1;
return 0;
}