40pts 求助
查看原帖
40pts 求助
377440
Y2y7m楼主2022/10/10 20:58
#include <iostream>

using namespace std;
#define int long long
int sty=-4713,stm=1,stday=1;
int csc_year_j=365*4+1;
int year_j[5]={0,366,365,365,365};//julian year
int csc_year_g=365*400+100-3;//Gregorian
int a[20]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int b[20]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int get_y_j(int x)//julian
{
    int t1=x/csc_year_j;
    t1*=4;
    int t2=x%csc_year_j;
    for(int i=1;i<=4;i++)
    {
        if(t2>=year_j[i])
        {
            t1++;
            t2-=year_j[i];
        }
        else
            break;
    }
    if(t1+sty>=0)
        t1++;
    return t1;
}
int get_m_j(int x)
{
    int tmp=get_y_j(x);
    if(tmp+sty>=0)
        tmp++;
    int t=x%csc_year_j;
    for(int i=1;i<=4;i++)
    {
        if(t>=year_j[i])
            t-=year_j[i];
        else
            break;
    }
    int ans=0;
    if(tmp%4==0)
        for(int i=1;i<=12;i++)
        {
            if(t>=b[i])
                ans++,t-=b[i];
            else
                break;
        }
    else
        for(int i=1;i<=12;i++)
        {
            if(t>=a[i])
                ans++,t-=a[i];
            else
                break;
        }
    return ans;
}
int get_d_j(int x)
{
    int tmp=get_y_j(x);
    if(tmp+sty>=0)
        tmp++;
    int t=x%csc_year_j;
    for(int i=1;i<=4;i++)
    {
        if(t>=year_j[i])
            t-=year_j[i];
        else
            break;
    }
    if(tmp%4==0)
        for(int i=1;i<=12;i++)
        {
            if(t>=b[i])
                t-=b[i];
            else
                break;
        }
    else
        for(int i=1;i<=12;i++)
        {
            if(t>=a[i])
                t-=a[i];
            else
                break;
        }
    return t;
}

//Gregorian
bool is_leap_year(int x)
{
    if(x%4==0&&x%100!=0)
        return 1;
    if(x%400==0)
        return 1;
    return 0;
}
int get_y_g(int x)
{
    int t1=x/csc_year_g*400;
    x%=csc_year_g;
    for(int i=0;i<400;i++)
    {
        int tmp=365;
        if(is_leap_year(i+1583)) tmp++;
        if(x>=tmp)
        {
            t1++;
            x-=tmp;
        }
    }
    return t1;
}
int get_m_g(int x)
{
    int t1=x/csc_year_g*400;
    x%=csc_year_g;
    for(int i=0;i<400;i++)
    {
        int tmp=365;
        if(is_leap_year(i+1583)) tmp++;
        if(x>=tmp)
        {
            t1++;
            x-=tmp;
        }
    }
    int t2=0;
    if(is_leap_year(t1+sty))
    {
        for(int i=1;i<=12;i++)
            if(x>=b[i])
            {
                x-=b[i];
                t2++;
            }
            else
                break;
    }
    else
    {
        for(int i=1;i<=12;i++)
            if(x>=a[i])
            {
                x-=a[i];
                t2++;
            }
            else
                break;
    }
    return t2;
}
int get_d_g(int x)
{
    int t1=x/csc_year_g*400;
    x%=csc_year_g;
    for(int i=0;i<400;i++)
    {
        int tmp=365;
        if(is_leap_year(i+1583)) tmp++;
        if(x>=tmp)
        {
            t1++;
            x-=tmp;
        }
    }
    if(is_leap_year(t1+1583))
    {
        for(int i=1;i<=12;i++)
            if(x>=b[i])
                x-=b[i];
            else
                break;
    }
    else
    {
        for(int i=1;i<=12;i++)
            if(x>=a[i])
                x-=a[i];
            else
                break;
    }
    return x;
}
signed main()
{
    ios::sync_with_stdio(false);
    int Q;
    cin>>Q;
    int x;
    while(Q--)
    {
        cin>>x;
        sty=-4713,stm=1,stday=1;
        int t1=get_d_j(x),t2=get_m_j(x),t3=get_y_j(x);
        int tmp=sty+t3;//now year
        if(tmp<0)
        {
            cout<<stday+t1<<" "<<stm+t2<<" "<<-(sty+t3)<<" BC"<<endl;
            continue;
        }
        if(tmp<1582||(tmp==1582&&stm+t2<10)||(tmp==1582&&stm+t2==10&&stday+t1<=4))
        {
            cout<<stday+t1<<" "<<stm+t2<<" "<<tmp<<endl;
            continue;
        }
        sty=1582,stm=10,stday=15;
        x-=2299162;
        int least=16+30+31;
        if(x<=least)
        {
            int ans1,ans2,ans3;
            ans1=sty,ans2=stm,ans3=stday;
            for(int i=1;i<=x;i++)
            {
                ans3++;
                if(ans3>a[ans2])
                {
                    ans2++;
                    ans3=1;
                }
                if(ans2>12)
                {
                    ans1++;
                    ans2=1;
                }
            }
            cout<<ans3<<" "<<ans2<<" "<<ans1<<endl;
            continue;
        }
        x-=least;
        sty=1583,stm=1,stday=1;
        t1=get_d_g(x),t2=get_m_g(x),t3=get_y_g(x);
        cout<<stday+t1<<" "<<stm+t2<<" "<<sty+t3<<endl;
    }
    return 0;
}
/*
 1
 283727928
 */

2022/10/10 20:58
加载中...