[codeup][算法笔记] 日期差值

日期差值

题目描述

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。

输入

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出

每组数据输出一行,即日期差值

样例输入

20130101
20130105

样例输出

5

思路1 晴神思路

假设第一个日期早于第二个日期(否则交换即可)

思路:让第一个日期不停+1,直到等于第二个日期

1.若d+1后,大于(当前月份m所应有的天数+1),那么让m+1,且重置天数d=1

2.若1.时,m=13,则令y+1,且重置m=1

为了方便统计每个月的天数:给定一个二维数组 int month[13][2]:[13]用来存放每个月的天数,[2]:0平年,[1]闰年

若想加快速度:

把第一个日期的年份不断+1,直到与第二个日期的年份相差1为止,期间根据平年或者闰年来累加365或者366即可,之后再开始+1天操作

#include<cstdio>
#include<iostream>
using namespace std;
int month[13][2]={{0,0},{31,31},{28,29},...};
bool isLeap(int year){
    return (year%4==0&&year%!=0)||(year%400==0);
}
int main(){
    int time1,y1,m1,d1;
    int time2,y2,m2,d2;
    while(scanf("%d%d",&time1,&time2)!=EOF){
        if(time1>time2){
            int temp=time1;
            time1=time2;
            time2=temp;
        }
        y1=time1/10000,m1=time1%1000/100,d1=time1%100;
        y2=time2/10000,m2=time2%1000/100,d2=time2%100;
        int ans=1;
        while ((y1<y2)&&(m1<m2)||(d1==d2))
        {
            d1++;
            if(d1==month[m1][isLeap(y1)]+1){
                m1++;
                d1=1;
            }
            if(m1==13){
                y1++;
                m1=1;
            }
            ans++;
        }
        cout<<ans;
    }
    return 0;
}

思路2 引入第三天:公元元年

https://blog.csdn.net/qq_22158743/article/details/85777266

计算两个日期分别到公元元年的日子

第一次代码

#include <iostream> 
using namespace std;

//判断是否为闰年
bool isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

//1-11月份的累计天数
int days[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};

//计算当前日期与公元元年之间的日期天数
int dayOffset(int year, int month, int day) {
    int res = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + days[month - 1] + day;
    return isLeapYear(year) && month > 2 ? res + 1 : res;
}


int main() {
    int time1,time2;//定义输入两个日期
    cin>>time1>>time2;//输出
    //计算对应年月日
    int y1=time1/1000;
    int y2=time2/1000;
    int m1=time1%1000/100;
    int m2=time2%1000/100;
    int d1=time1%100;
    int d2=time2%100;
    int res1=dayOffset(y1, m1, d1);
    int res2=dayOffset(y2, m2, d2);
    int res=(res1>res2)?res1-res2:res2-res1;
    cout  << (res+1); 


    return 0;
}


问题:

“有多组数据,每组数据有两行”,

导致OJ错误一半,

同时要注意到

修改:

#include <iostream>
using namespace std;

//判断是否为闰年
bool isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

//1-11月份的累计天数
int days[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};

//计算当前日期与公元元年之间的日期天数
int dayOffset(int year, int month, int day) {
    int res = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + days[month - 1] + day;
    return isLeapYear(year) && month > 2 ? res + 1 : res;
}


int main() {
    int time1,time2;//定义输入两个日期
    while (cin>>time1>>time2) {
        int y1=time1/10000;
        int y2=time2/10000;
        int m1=time1%10000/100;
        int m2=time2%10000/100;
        int d1=time1%100;
        int d2=time2%100;
        int res1=dayOffset(y1, m1, d1);
        int res2=dayOffset(y2, m2, d2);
        int res=(res1>res2)?res1-res2:res2-res1;

        cout  << (res+1) << endl;
    }

    return 0;
}

发表评论