zoukankan      html  css  js  c++  java
  • 日期计算

    //zzuli 1878
    1.
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<math.h>
    #include<ctype.h>
    #include<algorithm>
    using namespace std;
    #define N 1010000
    #define INF 0x3f3f3f3f
    
    int yearday[N];
    
    int IsLeap(int year)
    {
        return ((year%4==0&&year%100!=0) || year%400==0);
    }
    
    int main()
    {
        int T, y1, m1, d1, y2, m2, d2, sum;
        int tab[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 leap;
        yearday[1899]=0;
        for(int i=1900; i<=1000000; i++)
            yearday[i]=yearday[i-1]+(IsLeap(i)==1 ? 366 : 365);
        scanf("%d", &T);
    
        while(T--)
        {
            scanf("%d%d%d%d%d%d", &y1, &m1, &d1, &y2, &m2, &d2);
            sum=0;
            if(y1==y2)
            {
                leap=IsLeap(y1);
                for(int i=m1+1; i<m2; i++)
                    sum+=tab[leap][i];
                if(m1<m2)
                {
                    sum+=tab[leap][m1]-d1;
                    sum+=d2;
                }
                else
                    sum+=d2-d1;
                printf("%d
    ", sum);
            }
            else
            {
                leap=IsLeap(y1);
                for(int i=m1+1; i<=12; i++)
                    sum+=tab[leap][i];
                sum+=tab[leap][m1]-d1;
                leap=IsLeap(y2);
                for(int i=1; i<m2; i++)
                    sum+=tab[leap][i];
                sum+=d2;
                sum+=yearday[y2-1]-yearday[y1];
                printf("%d
    ", sum);
            }
        }
        return 0;
    }
    2.另解:我直接采用了1年1月1日到两个输入的日期分别有多少天然后计算差值。这样的话关于闰年比较好计算,可以用容斥...闰年数量为x/4-x/100+x/400...
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<math.h>
    #include<ctype.h>
    #include<algorithm>
    using namespace std;
    #define N 100100
    #define INF 0x3f3f3f3f
    
    int tab[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 IsLeap(int y)
    {
        return ((y%4==0&&y%100!=0) || (y%400==0));
    }
    
    int js(int y, int m, int d)
    {
        int sum=0, t, leap;
        t=(y-1)/4-(y-1)/100+(y-1)/400;
        sum+=365*(y-1)+t;
        leap=IsLeap(y);
        for(int i=1; i<m; i++)
            sum+=tab[leap][i];
        sum+=d;
        return sum;
    }
    
    int main()
    {
        int T, y1, m1, d1, y2, m2, d2, ans1, ans2;
        scanf("%d", &T);
    
        while(T--)
        {
            scanf("%d%d%d%d%d%d", &y1, &m1, &d1, &y2, &m2, &d2);
            ans1=js(y1, m1, d1);
            ans2=js(y2, m2, d2);
            printf("%d
    ", ans2-ans1);
        }
        return 0;
    }
    

      


      

  • 相关阅读:
    在Linux下安装和使用MySQL
    vc动态装载动态库
    stl学习(转帖2)
    makefile
    详细的MySQL C API
    Excel INTO SQLSERVER
    Outlook2010中预览Word,Excel附件问题
    11gRAC ASM管理的数据文件丢失恢复
    ASM上控制文件损坏时的恢复
    使用NET USER增加一个超级管理 & 激活Windows 7 administrator
  • 原文地址:https://www.cnblogs.com/9968jie/p/5405556.html
Copyright © 2011-2022 走看看