1582年后的有些数据会有一天的误差,求大犇指点
#include<iostream>
#include<cstdio>
using namespace std;
long long Q,i,j,rq[100010],mt[100010],d[100010],yr[100010],sf[100010],rp[100010];//rq:天数 mt:月份 d:日期 yr:年份 sf:是否是公元前 rp:是否是闰年
int db[401]={999999,365,730,1096,1461,1826,2191,2557,2922,3287,3652,4018,4383,4748,5113,5479,5844,6209,6574,6940,7305,7670,8035,8401,8766,9131,9496,9862,10227,10592,10957,11323,11688,12053,12418,12784,13149,13514,13879,14245,14610,14975,15340,15706,16071,16436,16801,17167,17532,17897,18262,18628,18993,19358,19723,20089,20454,20819,21184,21550,21915,22280,22645,23011,23376,23741,24106,24472,24837,25202,25567,25933,26298,26663,27028,27394,27759,28124,28489,28855,29220,29585,29950,30316,30681,31046,31411,31777,32142,32507,32872,33238,33603,33968,34333,34699,35064,35429,35794,36159,36524,36889,37254,37620,37985,38350,38715,39081,39446,39811,40176,40542,40907,41272,41637,42003,42368,42733,43098,43464,43829,44194,44559,44925,45290,45655,46020,46386,46751,47116,47481,47847,48212,48577,48942,49308,49673,50038,50403,50769,51134,51499,51864,52230,52595,52960,53325,53691,54056,54421,54786,55152,55517,55882,56247,56613,56978,57343,57708,58074,58439,58804,59169,59535,59900,60265,60630,60996,61361,61726,62091,62457,62822,63187,63552,63918,64283,64648,65013,65379,65744,66109,66474,66840,67205,67570,67935,68301,68666,69031,69396,69762,70127,70492,70857,71223,71588,71953,72318,72683,73048,73413,73778,74144,74509,74874,75239,75605,75970,76335,76700,77066,77431,77796,78161,78527,78892,79257,79622,79988,80353,80718,81083,81449,81814,82179,82544,82910,83275,83640,84005,84371,84736,85101,85466,85832,86197,86562,86927,87293,87658,88023,88388,88754,89119,89484,89849,90215,90580,90945,91310,91676,92041,92406,92771,93137,93502,93867,94232,94598,94963,95328,95693,96059,96424,96789,97154,97520,97885,98250,98615,98981,99346,99711,100076,100442,100807,101172,101537,101903,102268,102633,102998,103364,103729,104094,104459,104825,105190,105555,105920,106286,106651,107016,107381,107747,108112,108477,108842,109207,109572,109937,110302,110668,111033,111398,111763,112129,112494,112859,113224,113590,113955,114320,114685,115051,115416,115781,116146,116512,116877,117242,117607,117973,118338,118703,119068,119434,119799,120164,120529,120895,121260,121625,121990,122356,122721,123086,123451,123817,124182,124547,124912,125278,125643,126008,126373,126739,127104,127469,127834,128200,128565,128930,129295,129661,130026,130391,130756,131122,131487,131852,132217,132583,132948,133313,133678,134044,134409,134774,135139,135505,135870,136235,136600,136966,137331,137696,138061,138427,138792,139157,139522,139888,140253,140618,140983,141349,141714,142079,142444,142810,143175,143540,143905,144271,144636,145001,145366,145732,146097};
//格里高利历中1~n年的天数 n最大为400,即一周期 db[0]无用
int main()
{
// freopen("D:\\julian3.in","r",stdin);
// freopen("D:\\123.out","w",stdout);
cin>>Q;
for(i=0;i<Q;i++)
{
scanf("%d",&rq[i]);
if(rq[i]>=1721424) //判断是否公元前
{
sf[i]=1; //是否公元前
rq[i]-=1721424;
}
if(sf[i]==0) //如果是公元前
{
int rz=rq[i]/1461,snn=rq[i]%1461; //rz:有多少个4年,除去4n年后的天数
if(snn<366) //判断
{
rq[i]=snn;
rp[i]=1;
yr[i]=4713-rz*4;
}
if(snn>=366&&snn<731)
{
rq[i]=snn-366;
yr[i]=(4713-rz*4)-1;
}
if(snn>=731&&snn<1096)
{
rq[i]=snn-731;
yr[i]=4713-rz*4-2;
}
if(snn>=1096)
{
rq[i]=snn-1096;
yr[i]=4713-rz*4-3;
}
}
if(sf[i]==1) //如果是公元后
{
if(rq[i]>=577737) //如果是1582年10月4日后
{
yr[i]=1582; //从1582年开始加
rq[i]-=577460; //日期从1582年1月1日开始
rq[i]+=10;
int snn=rq[i]%146097;
int rz=rq[i]/146097;
yr[i]=yr[i]+rz*400;
rq[i]=rq[i]-rz*146097;
int high=400,low=1,middle=200;
if(snn>=365)
{
while(low<high) //二分查找减去400rz年后的天数靠近哪一年
{
middle=(high+low)/2;
if(snn>db[middle])
{
low=middle;
}
else if(snn<db[middle])
{
high=middle;
}
else if(snn==db[middle])
{
break;
}
if(low==high-1)
{
break;
}
}
middle=(high+low)/2;
yr[i]+=middle; //加上除去400n之外的年数
rq[i]=rq[i]-db[middle]; //日期减至366以内
if((yr[i]%4==0&&yr[i]%100!=0)||yr[i]%400==0) rp[i]=1; //判断是否为闰年
}
}
else //如果在公元后1582年10月4日之前
{
int rz=rq[i]/1461,snn=rq[i]%1461;
if(snn<365)
{
rq[i]=snn;
yr[i]=rz*4+1;
}
if(snn>=365&&snn<730)
{
rq[i]=snn-365;
yr[i]=rz*4+2;
}
if(snn>=730&&snn<1095)
{
rq[i]=snn-730;
yr[i]=rz*4+3;
}
if(snn>=1095)
{
rq[i]=snn-1095;
yr[i]=rz*4+4;
rp[i]=1;
}
}
}
if(rp[i]==1) //闰年
{
if(rq[i]>=335)
{
mt[i]=12;
d[i]=rq[i]-334;
}
else if(rq[i]>=305&&rq[i]<335)
{
mt[i]=11;
d[i]=rq[i]-304;
}
else if(rq[i]>=274&&rq[i]<305)
{
mt[i]=10;
d[i]=rq[i]-273;
}
else if(rq[i]>=244&&rq[i]<274)
{
mt[i]=9;
d[i]=rq[i]-243;
}
else if(rq[i]>=213&&rq[i]<244)
{
mt[i]=8;
d[i]=rq[i]-212;
}
else if(rq[i]>=182&&rq[i]<213)
{
mt[i]=7;
d[i]=rq[i]-181;
}
else if(rq[i]>=152&&rq[i]<182)
{
mt[i]=6;
d[i]=rq[i]-151;
}
else if(rq[i]>=121&&rq[i]<152)
{
mt[i]=5;
d[i]=rq[i]-120;
}
else if(rq[i]>=91&&rq[i]<121)
{
mt[i]=4;
d[i]=rq[i]-90;
}
else if(rq[i]>=60&&rq[i]<91)
{
mt[i]=3;
d[i]=rq[i]-59;
}
else if(rq[i]>=31&&rq[i]<60)
{
mt[i]=2;
d[i]=rq[i]-30;
}
else if(rq[i]>0&&rq[i]<31)
{
mt[i]=1;d[i]=rq[i]+1;
}
else if(rq[i]==0)
{
mt[i]=1;
d[i]=1;
}
}
if(rp[i]==0) //平年
{
if(rq[i]>=334)
{
mt[i]=12;
d[i]=rq[i]-333;
}
else if(rq[i]>=304&&rq[i]<334)
{
mt[i]=11;
d[i]=rq[i]-303;
}
else if(rq[i]>=273&&rq[i]<304)
{
mt[i]=10;
d[i]=rq[i]-272;
}
else if(rq[i]>=243&&rq[i]<273)
{
mt[i]=9;
d[i]=rq[i]-242;
}
else if(rq[i]>=212&&rq[i]<243)
{
mt[i]=8;
d[i]=rq[i]-211;
}
else if(rq[i]>=181&&rq[i]<212)
{
mt[i]=7;
d[i]=rq[i]-180;
}
else if(rq[i]>=151&&rq[i]<181)
{
mt[i]=6;
d[i]=rq[i]-150;
}
else if(rq[i]>=120&&rq[i]<151)
{
mt[i]=5;
d[i]=rq[i]-119;
}
else if(rq[i]>=90&&rq[i]<120)
{
mt[i]=4;
d[i]=rq[i]-89;
}
else if(rq[i]>=59&&rq[i]<90)
{
mt[i]=3;
d[i]=rq[i]-58;
}
else if(rq[i]>=31&&rq[i]<59)
{
mt[i]=2;
d[i]=rq[i]-30;
}
else if(rq[i]>0&&rq[i]<31)
{
mt[i]=1;d[i]=rq[i]+1;
}
else if(rq[i]==0)
{
mt[i]=1;
d[i]=1;
}
}
}
for(i=0;i<Q;i++)
{
cout<<d[i]<<" "<<mt[i]<<" "<<yr[i];
if(sf[i]==0) cout<<" "<<"BC"; //公元前则输出BC
cout<<endl;
}
return 0;
}