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;
}