10分球跳
查看原帖
10分球跳
1071907
lzhgrq楼主2025/8/2 07:53
#include<bits/stdc++.h> 
#define int long long
using namespace std;
int t,m,year,r;
int leap(int y){
	if(y<1582){
		return y%4==0;
	}
	if(y%400==0){
		return 1;
	}
	if(y%100==0){
		return 0;
	}
	return y%4==0;
}
signed main(){
//  freopen("julian.in","r",stdin);
//  freopen("julian.out","w",stdout);
	scanf("%lld",&t);
	while(t--){
		scanf("%lld",&r);
		if (r<2299161){//在 1582年10月4日及以前 
			int r1=r/1461;//3平+1闰(一组)=1461天 
			 r-=r1*1461;
			if (r<366){
				year=r1*4-4712;
			}
			else if(r<731){
				year=r1*4-4711;
				r -= 366;
			}
			else if(r<1096){
				year=r1*4-4710;
				r-=731;
			}
			else{
				year=r1*4-4709;
				r-=1096;
			}
		}
		else{//第n周期第d天的儒略日就是2159351+d+n*146097
			int r2=(r-=2159351)/146097;
			r-=r2*146097;
			year=1200+r2*400;
			r2=(r-1)/36524;
			r-=r2*36524;
			year+=r2*100;
			r2=r/1461;
			r-=r2*1461;
			year+=r2 * 4;
			if (r<366){
				if (!leap(year)){
					--r;
				}
			}
			else if(r<731 ){
				++year;
				r-=366;
			}
			else if(r < 1096){
				year+=2;
				r-=731;
			}
			else{
				year+=3;
				r-=1096;
			}
			if(leap(year)){
					if(r<31) m=1;
					else if(r<60) m=2,r-=31;
					else if(r<91) m=3,r-=60;
					else if(r<121) m=4,r-=91;
					else if(r<152) m=5,r-=121;
					else if(r<182) m=6,r-=152;
					else if(r<213) m=7,r-=182;
					else if(r<244) m=8,r-=213;
					else if(r<274) m=9,r-=244;
					else if(r<305) m=10,r-=274;
					else if(r<335) m=11,r-=305;
					else m=12,r-=335;
			}
			else{
				if(r<31) m=1;
				else if(r<59) m=2,r-=31;
				else if(r<90) m=3,r-=59;
				else if(r<120) m=4,r-=90;
				else if(r<151) m=5,r-=120;
				else if(r<181) m=6,r-=151;
				else if(r<212) m=7,r-=181;
				else if(r<243) m=8,r-=212;
				else if(r<273) m=9,r-=243;
				else if(r<304) m=10,r-=273;
				else if(r<334) m=11,r-=304;
				else m=12,r-=334;
				}
		}
		int day=r+1;
		if(year>0){
			printf("%lld %lld %lld\n",day,m,year);
		}
		else{
			printf("%lld %lld %lld BC\n",day,m,1-year);
		}
	}
	return 0;
}
2025/8/2 07:53
加载中...