引:
如果你见到一个oi对着
4713
,1582
146097
2299160
颠颠地笑,不用怀疑,他是在做那道名题–《csp-s2020 T1 儒略日》
这道题,我做了三年,平均每年做一次,我来讲讲我的心得。
读题
题面很长,细节很多,我们需要耐心细心的读,此时多花一点时间是划得来的。
我们得出大致关系如下
我们对公历都有一定的了解吧,比如 平年十二个月的天数, 比如小学教的 “一三五七八十腊”,四年一闰百年不闰四百年又闰,这些宝贵的经验将成为我们解题的关键说的呢。
格里高利相较于公历其实更为简单,因为太简单不准所以才改的嘛 ,就是闰年的计算规则不同,是每四年一闰。
解题
首先,这是一道人尽皆知的模拟题。模拟的概念太笼统了,实现起来也八仙过海,我来讲讲我觉得最适合入手这道关于日期的大模拟。
解题的方向
我们要想着化繁为简,一个劲的分类讨论不见得总是好事(我第一次就这么G的)。
多想想在 coding , 写代码的时间总是小于调 bug 的时间的。
我的思路
我们发现,将日期分为儒略历和公历是比较好的,将公元前的日期归化到儒略历的一部分,不用特殊处理,具体来讲,将公元前的日期年份 y y y − > -> −> − y + 1 \ -y + 1 −y+1 比如BC 4713 变为 -4712 ,这阳处理闰年也方便。
我们来算一下儒略历一共多少天
首先公元前天数 365 * 4713 + 4713 / 4
公元后的天数1581 * 365 + 1581 / 4 + 277
1582(不含)年以前的和1582年的277天。
总共 2299160
天。
对于较简单的儒略历,我们可以直接算
int y = -4712, m = 1, d = 1;
if (x <= Ru) {
y += x / (_1 *