[CSP-S2020] 儒略日 解题报告

原题链接
关于我切了儒略日这件事。
这玩意真的毒瘤。。

众所周知,这是一道 b i g 11451 4 1919810 big^{114514^{1919810}} big1145141919810 模拟,虽然只是一道CSPS的T1,但确实很难写,某学会又特地卡了暴力……
所以我们要学会优雅的暴力哈哈哈哈哈哈哈……(嚣张的笑声)
《关于优雅》

好吧不扯了,现在开始来看看这个麻烦而又有趣的大模拟咯。

首先可以想到,它不是分两种历法吗,我们就直接分开讨论。
首先是儒略历部分。由题可知,我们可以先将所有四年都噶掉剔除开,直接将其和年份挂钩。

yy=-4713; mm=1; dd=1;
tmp=r;				//输入的儒略日
yy+=4*(tmp/1461);
tmp%=1461;

剩下的天数显然是不足4年,由题可知,BC4713是闰年,所以若干个四年后依然是闰年。求出tmp还有多少年,再一次修改年份。

if(tmp>=366){
   
	yy+=1+(tmp-366)/365;			//先将闰年分离开
	tmp=(tmp-366)%365;
}

此时注意,根据题面,公元零年是不存在的,我们把它噶掉(迫真)

if(yy>=0) ++yy;				//关于公元零年,它死了

最后根据提议对月份和日期进行修改即可。当然,由于天文学界的良心,儒略日是从一个闰年的1月1日开始算的,所以不需要考虑月份和日期的“进位”

while(tmp>=mn[mm]+(mm==2 && (yy<0 && (abs(yy)%4==1) || (yy>0 && yy%4==0)))){
   
	tmp-=mn[mm]+(mm==2 && (yy<0 && (abs(yy)%4==1) || (yy>0 && yy%4==0)));
	++mm;				//此处条件看题
}
dd+=tmp;				//加就完了

总结:

yy=-4713; mm=1; dd=1;
tmp=r;				//输入的儒略日
yy+=4*(tmp/1461);
tmp%=1461;
if(tmp>=366){
   
	yy+=1+(tmp-366)/365;			//先将闰年分离开
	tmp=(tmp-366)%365;
}
if(yy>=0) ++yy;				//关于公元零年,它死了
while(tmp>=mn
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值