首页 > 其他分享 >DreamJudge-1290-日期差值

DreamJudge-1290-日期差值

时间:2024-06-10 23:45:04浏览次数:27  
标签:int 31 DreamJudge Date base 差值 datestr date 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;
}

标签:int,31,DreamJudge,Date,base,差值,datestr,date,1290
From: https://www.cnblogs.com/trmbh12/p/18241237

相关文章

  • DreamJudge-1011-日期
    1.题目描述TimeLimit:1000msMemoryLimit:256mb今天是2012年4月12日星期四,编写程序,输入今天开始到12月31日之间的任意日期,输出那一天是星期几。例如输入“5(回车)20(回车)”(5月20日),输出应为“Sunday”。输入输出格式输入描述:输入第一行为月份。输入第二行为这个月的第......
  • LeetCode 2903.找出满足差值条件的下标I
    1.题目要求如图所示:由题意可知我们如果要满足差值条件,我们可以使用迭代法,让下标i从零开始,我们再设一个变量j,然后让j等于下标加上indexDifference,再用for循环遍历j,再采用abs(nums[i]-nums[j])是否大于等于valueDifference,如果大于则break;以上就是代码算法思路接下来......
  • 【华为OD】D卷真题100分:分割数组的最大差值 Java代码实现[思路+代码]
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客JS、Java、python、C、C++代码实现:【华为OD】D卷真题100分:分割数组的最大差值JavaScript代码实现[思路+......
  • 【leetcode每日一题】——2903. 找出满足差值条件的下标 I——python
    给你一个下标从 0 开始、长度为 n 的整数数组 nums ,以及整数 indexDifference 和整数 valueDifference 。你的任务是从范围 [0,n-1] 内找出  2 个满足下述所有条件的下标 i 和 j :abs(i-j)>=indexDifference 且abs(nums[i]-nums[j])>=valueDi......
  • Linux 中 awk 实现 每四个一组计算每组第四个和第一个之间的差值
     001、方法1(基本逻辑是先提取每组的第一行和第四行;然后将没两行转换为1行;最后将第二行再减去第一行)[root@PC1test2]#lsa.txt[root@PC1test2]#cata.txt##测试数据2.6993502.6993592.6999402.6999463.0750093.0750163.0751113.075118[roo......
  • vue+element-ui在表格中计算两数差值并让差值>20的字体显示为红色
    <el-table-columnprop="differential"label="差量"class-name="small-paddingfixed-width"><templateslot-scope="scope"><span:c......
  • 一分钟冲刺完拉格朗日差值
    介绍拉格朗日差值是设计一条次数为\(n-1\)次的多项式穿过\(n\)个点。我们知道,给定\(n\)个点确定一条唯一的\(n-1\)次多项式。算法我们引入一个开关。对于\(x_1,x_2,x_3\),我们想让当\(x=x_1\)时,\(g(x)=y_1\),当\(x=x_2\)或\(x=x_3\)时,\(g(x)=0\)。所以拉格......
  • 每日一题:1026. 节点与其祖先之间的最大差值
    给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V=|A.val-B.val|,且 A 是 B 的祖先。(如果A的任何子节点之一为B,或者A的任何子节点是B的祖先,那么我们认为A是B的祖先) 示例1:输入:root=[8,3,10,1,6,null,14,null,null,4,......
  • 巧用Excel计算年份间天数差值
    0.问题1.题解1.1普通思路如果正常计算需要考虑到闰年的计算,然后计算出总天数/7得到总周数(有可能是个小数,多出来的天数),之后还要知晓开始时间和结束时间是周几,要不要多计算星期一1.2使用Excel首先在开头两个单元格周输入时间,然后在第三个单元格直接输入=,然后分别选......
  • 排序算法练习——最大间距:给定一个未排序的数组,找到排序后相邻元素之间的最大差值
    最大间距:给定一个未排序的数组,找到排序后相邻元素之间的最大差值。解决这个问题可以使用桶排序的思想。具体步骤如下:找到数组中的最大值和最小值。根据数组的长度,将数组划分成一定数量的桶,每个桶存放一定范围内的元素。计算每个桶内元素的最小值和最大值。遍历桶,计算相邻......