题解(儒略日)
2024-09-05 15:26:09
发布于:四川
C版:
#include<bits/stdc.h>
using namespace std;
bool bc_run[5005],ad_run[2005];
long long a,ans_year,ans_month,ans_day,t;
int T,M[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int check_run(int x){
if(x%4000) return 1;
if(x%100!=0&&x%40) return 1;
return 0;
}
void solve(){
//================================== 公元前==================================
if(a<=1721423){
a++;
int t=a/1461;
a%=1461;
ans_year=t*4;
if(a==0){
printf("31 12 %lld BC\n",4713-ans_year+1);
return ;
}
if(a>366){
a-=366,ans_year++;
while(a>365) a-=365,ans_year++;
}
if(bc_run[4713-ans_year]) M[2]=29;
else M[2]=28;
ans_month=1;
for(int i=1;i<=12;i++){
if(a>M[i]){
a-=M[i];
ans_month=i+1;
}
else break;
}
ans_day=a;
printf("%lld %lld %lld BC\n",ans_day,ans_month,4713-ans_year);
return ;
}
a-=1721423;
//========================= 公元1.1.1 ~ 公元1582.10.4 =========================
if(a<=577737){
int t=a/1461;
a%=1461;
ans_year=t*4;
if(a==0){
printf("31 12 %lld\n",ans_year);
return ;
}
ans_year++;
while(a>365) a-=365,ans_year++;
if(ad_run[ans_year]) M[2]=29;
else M[2]=28;
ans_month=1;
for(int i=1;i<=12;i++){
if(a>M[i]){
a-=M[i];
ans_month=i+1;
}
else break;
}
ans_day=a;
printf("%lld %lld %lld\n",ans_day,ans_month,ans_year);
return ;
}
a-=577737;
//====================== 公元1582.10.15 ~ 公元1582.12.31 =======================
if(a<=78){
ans_year=1582,ans_month=10;
if(a>17) ans_month++,a-=17;
if(a>30) ans_month++,a-=30;
ans_day=a;
if(ans_month==10) ans_day+=14;
printf("%lld %lld %lld\n",ans_day,ans_month,ans_year);
return ;
}
a-=78;
//============================== 公元1583.1.1 ~ ? ==============================
ans_year=1583;
int t=a/146097;
a%=146097;
ans_year+=t*400;
for(int i=1;i<=400;i++){
int tmp=365+check_run(ans_year);
if(a>tmp) a-=tmp,ans_year++;
else break;
}
if(a==0){
printf("31 12 %lld\n",ans_year-1);
return ;
}
if(check_run(ans_year)) M[2]=29;
else M[2]=28;
ans_month=1;
for(int i=1;i<=12;i++){
if(a>M[i]){
a-=M[i];
ans_month=i+1;
}
else break;
}
ans_day=a;
printf("%lld %lld %lld\n",ans_day,ans_month,ans_year);
return ;
//==============================================================================
}
int main(){
//freopen("tt.txt","w",stdout);
//freopen("r.in","r",stdin);
//freopen("my.in","w",stdout);
for(int i=1;i<=4713;i++) if(i%41) bc_run[i]=1;
for(int i=1;i<=1582;i++) if(i%40) ad_run[i]=1;
scanf("%d",&T);
for(int i=1;i<=T;i++){
scanf("%lld",&a);
solve();
}
return 0;
}
/*
for(int i=1;i<=4713;i++) if(i%4==1) bc_run[i]=1;
for(int i=1;i<=4713;i++) t+=(bc_run[i])?366:365;
cout<<t-1;
BC: 1721423
*/
/*
for(int i=1;i<=1582;i++) if(i%4==0) ad_run[i]=1;
for(int i=1;i<=1581;i++) t+=(ad_run[i])?366:365;
cout<<t+31+28+31+30+31+30+31+31+30+4;
AD 儒略历: 577737
*/
/*
bool check_run(int x){
if(x%4000) return 1;
if(x%100!=0&&x%40) return 1;
return 0;
}
for(int i=1;i<=400;i++){
if(check_run(i)) t++;
t+=365;
}
cout<<t;
400年周期: 146097
*/
全部评论 1
最长的了
2024-09-07 来自 四川
0
有帮助,赞一个