环保局网站如何做备案证明,16年百度对泛解析网站的惩罚,建网站的企业,网站备案查询网站这道题#xff0c;我做了三年#xff0c;平均每年做一次#xff0c;我来讲讲我的心得。
读题
题面很长#xff0c;细节很多#xff0c;我们需要耐心细心的读#xff0c;此时多花一点时间是划得来的。
我们得出大致关系如下 历法公历日常用历儒略历公元前公元后历法公历…这道题我做了三年平均每年做一次我来讲讲我的心得。
读题
题面很长细节很多我们需要耐心细心的读此时多花一点时间是划得来的。
我们得出大致关系如下 历法公历日常用历儒略历公元前公元后历法公历日常用历儒略历公元前公元后历法{公历(日常用历)儒略历{公元前公元后 我们对公历都有一定的了解吧比如 平年十二个月的天数 比如小学教的 “一三五七八十腊”四年一闰百年不闰四百年又闰这些宝贵的经验将成为我们解题的关键说的呢。
格里高利相较于公历其实更为简单因为太简单不准所以才改的嘛 就是闰年的计算规则不同是每四年一闰。
解题
首先这是一道人尽皆知的模拟题。模拟的概念太笼统了实现起来也八仙过海我来讲讲我觉得最适合入手这道关于日期的大模拟。
解题的方向
我们要想着化繁为简一个劲的分类讨论不见得总是好事我第一次就这么G的。
多想想在 coding 写代码的时间总是小于调 bug 的时间的。
我的思路
我们发现将日期分为儒略历和公历是比较好的将公元前的日期归化到儒略历的一部分不用特殊处理具体来讲将公元前的日期年份 y − −y1 比如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 * 4 1) * 4;x % (_1 * 4 1);while(x (_1 (y % 4 0))) x - (_1 (y % 4 0)), y;while(x (M[m] (m 2 y % 4 0))) x - (M[m] (m 2 y % 4 0)), m;d x;if (y 1) {cout d m 1 - y BC endl;} else {cout d m y endl;}}代码中(M[m] (m 2 y % 4 0) 是处理闰年的二月日期28-29
注意的是 1 1 4713 BC 是第0天
对于周期的存储我们可以这样//公历下
int _1 365, _4 4 * _1 1, _100 25 * _4 - 1, _400 _100 * 4 1; //100,400是公历下的
int M[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};对于公历 我们考虑将1582 10 15 到 1982 10 14日这400年打一个小表这样极大简化了我们的计算量
else {x - Ru;y 0;y x / _400 * 400; x % _400;cout a[x].d a[x].m y a[x].y endl; }其中a是打出来的表a[x]是四百年中的第几天10月15 日算第一天。
那么怎么打出这个表
答用手打 可以用结构体。
struct dt{int y, m, d;dt(){}dt(int _y, int _m, int _d) {y _y, m _m, d _d;}
}a[maxn], be {1582, 10, 15};然后四百年迭代一遍 dt v be;for (int i 1; i _400; i) {a[i] v;nxt(v);}我们只需处理简单的一天的日期跳转
void nxt(dt x) {x.d;if (x.d (M[x.m] ck(x))) {x.d - (M[x.m] ck(x));x.m;}if (x.m 12) {x.m 1;x.y;}
}ck 是处理闰年二月
bool ck(dt x) {if (x.y % 4 0 x.y % 100 ! 0 || x.y % 400 0) {return x.m 2;} else return 0;
}于是我们便做完了这道大模拟。