社区讨论

蒟蒻50pts求助

P7075[CSP-S 2020] 儒略日参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo7zie6t
此快照首次捕获于
2023/10/27 10:18
2 年前
此快照最后确认于
2023/10/27 10:18
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll rl;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

inline bool rn(ll x){
	return ((x%4==0&&x%100!=0)||x%400==0);
}

inline bool rlrn(ll x){
	return (x%4==0);
}

inline void solve(){
	cin>>rl;
	ll year,mon=1,date=1;
	if(rl<=1721423){
		rl+=1;
		year=4713;
		
//		while(rl>=146100) year-=400,rl-=146100;
		ll x=rl/146100;year-=(400*(x)),rl%=146100;
		
//		while(rl>=1461) year-=4,rl-=1461;
		x=rl/1461;year-=4*x,rl%=1461;
		
		while(rl>365){
			if(rlrn(year-1)){
				if(rl>366) year-=1,rl-=366;
				else break;
			} 
			else year-=1,rl-=365;
		}
		for(register int i=1;i<=12;++i){
			if(i==2&&rlrn(year-1)){
				if(rl>29){
					rl-=29,
					++mon;
					continue;	
				}
				else break;
			}
			if(rl>month[i]){
				rl-=month[i],
				++mon;
				continue;
			}
			else break;
		}
		date=rl;
		cout<<date<<" "<<mon<<" "<<year<<" BC\n";
		return;
	}
	if(rl<=2295160){
		rl-=1721423,year=1;
		
//		while(rl>=1461) year+=4,rl-=1461;
		ll x=rl/1461;year+=4*x,rl%=1461;
		
		while(rl>365){
			if(rlrn(year)){
				if(rl>366) year+=1,rl-=366;
				else break;
			} 
			else year+=1,rl-=365;
		}
		for(register int i=1;i<=12;++i){
			if(i==2&&rlrn(year)){
				if(rl>29){
					rl-=29,
					++mon;
					continue;
				}
				else break;
			}
			if(rl>month[i]){
				rl-=month[i],
				++mon;
				continue;
			}
			else break;
		}
		date=rl;
		cout<<date<<" "<<mon<<" "<<year<<"\n";
		return;
	}
	else{
		rl-=2299161,date=15,mon=10,year=1582;
		if(rl<=16){
			cout<<rl+15<<" 10 "<<year<<"\n";
			return;
		}
		if(rl<=16+month[11]){
			cout<<rl-16<<" 11 "<<year<<"\n";
			return;
		}
		if(rl<=16+month[11]+month[12]){
			cout<<rl-16-30<<" 12 1582\n";
			return;
		}
		rl-=77,++year,mon=1,date=1;
		
//		while(rl>=146097) year+=400,rl-=146097;
		ll x=rl/146097;year+=400*x;rl-=146097*x;
		
		while(rl>365){
			if(rn(year)){
				if(rl>366) year+=1,rl-=366;
				else break;
			} 
			else year+=1,rl-=365;
		}
		for(register int i=1;i<=12;++i){
			if(i==2&&rn(year)){
				if(rl>29){
					rl-=29,
					++mon;
					continue;
				}
				else break;
			}
			if(rl>month[i]){
				rl-=month[i],
				++mon;
				continue;
			}
			else break;
		}
		date=rl;
		cout<<date<<" "<<mon<<" "<<year<<"\n";
		return;
	}
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int _;cin>>_;
	while(_--) solve();
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...