我自己测试的结果是在1582年之后的有的日期多了一天,但有的又没有,不知道哪里错了
#include<bits/stdc++.h>
using namespace std;
long long q,r,d,m,y;
bool fla;//是否为闰年
void jc()//知道天数算日期月份
{
if(fla)
{
if(r<=213)
{
if(r<=31) m=1;
else if(r<=60) m=2,r-=31;
else
{
r-=60;
m=3;
m+=((r-1)/61)*2;
r%=61;
if(!r) r=61;
if(r>31) m++,r-=31;
}
}
else
{
r-=213;
m=8+((r-1)/61)*2;
r%=61;
if(!r) r=61;
if(r>31) m++,r-=31;
}
}
else
{
if(r<=212)
{
if(r<=31) m=1;
else if(r<=59) m=2,r-=31;
else
{
r-=59;
m=3;
m+=((r-1)/61)*2;
r%=61;
if(!r) r=61;
if(r>31) m++,r-=31;
}
}
else
{
r-=212;
m=8+((r-1)/61)*2;
r%=61;
if(!r) r=61;
if(r>31) m++,r-=31;
}
}
}
int main()
{
scanf("%lld",&q);
while(q--)
{
scanf("%lld",&r);
r++;
if(r<=1721424)//公元前
{
fla=1;
y=((r-1)/1461)*4;
r%=1461;
if(!r) r=1461;
if(r>366)
{
r-=366,y++,fla=0;
while(r>365) r-=365,y++;
}
jc();
printf("%lld %lld %lld BC\n",r,m,4713-y);
}
else//公元后
{
r-=1721424;
if(r>577737) r+=10;//那十天
y=1;
if(r<=578556)//1584前
{
y+=((r-1)/1461)*4;
r%=1461;
if(!r) r=1461;
if(r>365) r-=365,y++;
if(r>365) r-=365,y++;
if(r>365) r-=365,y++;
if(y%4==0) fla=1;
else fla=0;
jc();
}
else
{
r-=578556;
y=1585;
y+=((r-1)/146097)*400;
r%=146097;
if(!r) r=146097;
y+=((r-1)/36524)*100;
r%=36524;
if(!r) r=36524;
y+=((r-1)/1461)*4;
r%=1461;
if(!r) r=1461;
if(r>365) r-=365,y++;
if(r>365) r-=365,y++;
if(r>365) r-=365,y++;
if(y%400==0||(y%4==0&&y%100!=0))fla=1;
else fla=0;
jc();
}
printf("%lld %lld %lld\n",r,m,y);
}
}
return 0;
}