#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
ll x,days[7],year,month,day;
ll _4y()
{
return 365*4+1;
}
ll _100y()
{
return _4y()*25-1;
}
ll _400y()
{
return _100y()*4+1;
}
ll _1y1m1d()
{
return _4y()*(4712/4)+366;
}
ll _1582y1m1d()
{
return _1y1m1d()+_4y()*(1580/4)+365;
}
ll _1582y10m4d()
{
int t=_1582y1m1d()+3;
for(int i=1;i<=9;i++)
t+=months[i];
return t;
}
ll _1582y10m15d()
{
return _1582y10m4d()+1;
}
ll _1582y11m1d()
{
return _1582y10m15d()+17;;
}
ll _1583y1m1d()
{
return _1582y11m1d()+61;
}
ll _1601y1m1d()
{
return _1583y1m1d()+_4y()*4+731;
}
bool check(ll n)
{
if(n%400==0||n%4==0&&n%100)
return true;
return false;
}
void change(int q)
{
x-=days[q];
ll t,tt;
switch(q)
{
case 0:
year=1601,month=1,day=1;
t=x/_400y()*400;
x-=t/400*_400y();
tt=x/_100y()*100;
t+=tt;
x-=tt/100*_100y();
tt=x/_4y()*4;
t+=tt;
x-=tt/4*_4y();
tt=x/365;
t+=tt;
x-=tt*365;
year+=t;
if(check(year-1))
year--,x=365;
for(;months[month]<=x;month++)
{
x-=months[month];
if(month==2&&check(year))
x--;
if(x<0)
{
x=28,month=2;
break;
}
}
break;
case 1:
year=1583,month=1,day=1;
if(x>365)
{
x-=365,year++;
if(x>366)
{
x-=366,year++;
t=x/_4y()*4;
x-=t/4*_4y();
tt=x/365;
x-=tt,t+=tt;
if(tt==4)
t--,x=365;
year+=t;
}
}
for(;months[month]<=x;month++)
{
x-=months[month];
if(month==2&&year%4==0)
x--;
if(x<0)
{
x=28,month=2;
break;
}
}
break;
case 2:
year=1582,month=11,day=1;
for(;months[month]<=x;month++)
x-=months[month];
break;
case 3:
year=1582,month=10,day=15+x;
break;
case 4:
year=1582,month=10,day=4;
break;
case 5:
year=1582,month=1,day=1;
for(;month<=9&&months[month]<=x;month++)
x-=months[month];
break;
case 6:
month=1,day=1;
t=x/_4y()*4;
x-=t/4*_4y();
tt=x/365;
x-=tt*365;
t+=tt;
if(tt==4)
t--,x=365;
year=t+1;
for(;months[month]<=x;month++)
{
x-=months[month];
if(month==2&&year%4==0)
x--;
if(x<0)
{
x=28,month=2;
break;
}
}
break;
}
day+=x;
}
int main()
{
freopen("julian.in","r",stdin);
freopen("julian.out","w",stdout);
days[0]=_1601y1m1d(),days[1]=_1583y1m1d(),days[2]=_1582y11m1d(),days[3]=_1582y10m15d();
days[4]=_1582y10m4d(),days[5]=_1582y1m1d(),days[6]=_1y1m1d();
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&x);
year=-4713,month=1,day=1;
for(int i=0;i<7;i++)
{
if(x<days[i])
continue;
change(i);
break;
}
if(year==-4713)
{
year=-year;
ll t=x/_4y()*4,tt;
x-=t/4*_4y(),tt=(x-1)/365;
if(tt)
x-=tt*365+1,t+=tt;
year-=t;
for(;months[month]<=x;month++)
{
x-=months[month];
if(month==2&&year%4==1)
x--;
if(x<0)
{
x=28,month=2;
break;
}
}
day+=x;
printf("%lld %lld %lld BC\n",day,month,year);
}
else
printf("%lld %lld %lld\n",day,month,year);
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
这是代码,5~10点WA(希望大家能看不懂)