模板 - 日期类

原来历史上1582年10月4日的下一天是1582年10月15日;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct Date {
    int y, m, d;

    Date(int y=0,int m=0,int d=0):y(y),m(m),d(d){}

    void nextDate() {
        ++d;
        carryDay();
    }
    void carryDay() {
        if(y==1582&&m==10&&d==5){
            d=15;
            return;
        }

        if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
            if(d == 32) {
                d = 1;
                ++m;
                carryMonth();
            }
        } else if(m != 2) {
            if(d == 31) {
                d = 1;
                ++m;
            }
        } else {
            if(isLeapYear()) {
                if(d == 30) {
                    d = 1;
                    ++m;
                }
            }
            else{
                if(d == 29) {
                    d = 1;
                    ++m;
                }
            }
        }
    }

    void carryMonth(){
        if(m==13){
            m=1;
            ++y;
        }
    }

    bool isLeapYear(){
        return (y%4==0&&y%100!=0||y%400==0);
    }

    ll toLongLong(){
        return (10000ll*y+100ll*m+d);
    }

    int Zeller(){
        //0 是 星期日
        if(y>1582||(y==1582&&(m>10||(m==10&&d>4))))
           return Zeller1();
        else
            return Zeller2();
    }

    int Zeller1(){
        int _c,_y=y,_m=m,_d=d;
        if(_m<=2)
            _m+=12,_y-=1;
        _c=_y/100;
        _y%=100;
        return ((_y+_y/4+_c/4-2*_c+13*(_m+1)/5+_d-1)%7+7)%7;
    }
    int Zeller2(){
        int _c,_y=y,_m=m,_d=d;
        if(_m<=2)
            _m+=12,_y-=1;
        _c=_y/100;
        _y%=100;
        return ((_y+_y/4+_c/4-2*_c+13*(_m+1)/5+_d+2)%7+7)%7;
    }
}date;

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    date=Date(1500,1,1);
    int cnt=0;
    for(int i=1;i<=50000;++i){
        cout<<date.toLongLong()<<" "<<date.Zeller()<<" ";
        ++cnt;
        if(cnt==7){
            cnt=0;
            puts("");
        }

        date.nextDate();
    }
    //cout<<date.Zeller();
}
posted @ 2019-08-04 13:18  韵意  阅读(214)  评论(0编辑  收藏  举报