DreamJudge-1290-日期差值

DawnTraveler發表於2024-06-10

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

相關文章