萌新40分求助
查看原帖
萌新40分求助
362183
131354320hy楼主2021/10/16 16:12

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;
}
2021/10/16 16:12
加载中...