日期差值

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

这种求日期之间相差天数的题目有一个很直接的思路,即令日期不断加1天,直到第一个日期等于第二个日期为止,即可统计出答案。具体处理时,如果当加了一天之后天数d等于当前月份m所拥有的天数加1,那么就令月份m加1、同时置天数d为1号(即把日期变为下一个月的1号);如果此时月份m变为了13,那么就令年份y加1、同时置月份m为1月(即把日期变为下一年的1月)。

const int N=110;
int month[2][13]={
    {0,31,28,31,30,31,30,31,31,30,31,30,31},
    {0,31,29,31,30,31,30,31,31,30,31,30,31}
};
int n,m;

bool isLeap(int year)
{
    return year % 4 == 0 && year % 100 || year % 400 == 0;
}

int main()
{
    while(cin>>n>>m)
    {
        if(n > m) swap(n,m);

        int yy1=n/10000,mm1=n%10000/100,dd1=n%10000%100;
        int yy2=m/10000,mm2=m%10000/100,dd2=m%10000%100;

        int ans=1;
        while(yy1 < yy2 || mm1 < mm2 || dd1 < dd2)
        {
            ans++;

            dd1++;
            if(dd1 == month[isLeap(yy1)][mm1]+1)
            {
                mm1++;
                dd1=1;
            }
            if(mm1 == 13)
            {
                yy1++;
                mm1=1;
            }
        }

        cout<<ans<<endl;
    }
    //system("pause");
    return 0;
}

另解

求出每个日期和\(0000\)\(1\)\(1\)日的天数间隔,作差即可。

int month[2][13]={
    {0,31,28,31,30,31,30,31,31,30,31,30,31},
    {0,31,29,31,30,31,30,31,31,30,31,30,31}
};
int n,m;

bool isLeap(int year)
{
    return year % 4 == 0 && year % 100 || year % 400 == 0;
}

int calc(int yy,int mm,int dd)
{
    int res=0;
    for(int i=0;i<yy;i++)
        if(isLeap(i))
            res+=366;
        else
            res+=365;

    for(int i=1;i<mm;i++)
        res+=month[isLeap(yy)][i];
    res+=dd;
    return res;
}

int main()
{
    while(cin>>n>>m)
    {
        if(n > m) swap(n,m);

        int yy1=n/10000,mm1=n%10000/100,dd1=n%10000%100;
        int yy2=m/10000,mm2=m%10000/100,dd2=m%10000%100;

        cout<<calc(yy2,mm2,dd2)-calc(yy1,mm1,dd1)+1<<endl;
    }
    //system("pause");
    return 0;
}
posted @ 2021-04-17 22:07  Dazzling!  阅读(80)  评论(0编辑  收藏  举报