• 日期差值


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

    这种求日期之间相差天数的题目有一个很直接的思路,即令日期不断加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;
    }
    
  • 相关阅读:
    【机器学习基础】02、matplotlib基本01
    HIVE学习笔记
    实时数仓项目-01实时模块搭建
    net_framework-EF CodeFirst
    一些前端知识的小记
    .netcore-FreeSql的使用-搭建context
    netcore配置文件与发布
    .netcore与vue的学习笔记001
    .net项目的mvc简单发布
    .net中的SelectList在Html.DropdownList中的使用
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14672314.html
Copyright © 2020-2023  润新知