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

posted @ 2024-06-10 23:37  DawnTraveler  阅读(5)  评论(0编辑  收藏  举报