[CSP2020]儒略日
儒略日
题解
其实是挺简单的一道模拟题,但对于笔者这种考场上打了2h,结果最后2min加上一行代码挂了60pts的人来说确实不大友好
这道题主要就是涉及到闰年的判断与年份的增长,只有儒略历与格里高利历之间的转化有一些难办。于是我们可以将整个历史通过1582年分作两段。向前的一段最大闰年是一100年为单位的,而之后是以400年为单位。
我们就一段一段的暴力增长,类似倍增,先是100年,再是4年,最后是一年,之后再分一天一天的来增长。而在1582年后,就直接先将400年的涨完,在涨剩下年份。
时间复杂度是明显可以过的,这里就不算了。
源码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
typedef long long LL;
#define int LL
typedef pair<int,int> pii;
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while('0'>s||'9'<s){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
int q,r;
struct ming{int yr,mh,dy;}st;
bool check(int x){if(x<0)return ((-x)%4==1)?1:0;if(x<=1582)return (x%4==0)?1:0;if(x%4==0&&x%100!=0)return 1;return (x%400==0)?1:0;
}
signed main(){//freopen("julian.in","r",stdin);//freopen("julian.out","w",stdout);read(q);while(q--){read(r);st=(ming){-4713,1,1};bool flag=0;while(1){if(check(st.yr)==1&&r<366)break;if(check(st.yr)==0&&r<365)break;if(st.yr<1480){if(r<36525){if(r<1461){if(check(st.yr)==1)r-=366,st.yr++;else r-=365,st.yr++;}else{if(!check(st.yr)&&!check(st.yr+1)&&!check(st.yr+2)&&!check(st.yr+3))r-=1460,st.yr+=4;else r-=1461,st.yr+=4;}}else r-=36525,st.yr+=100;}else{if(st.yr>1582){if(r<146097){if(r<1461){if(check(st.yr)==1)r-=366,st.yr++;else r-=365,st.yr++;}else{if(!check(st.yr)&&!check(st.yr+1)&&!check(st.yr+2)&&!check(st.yr+3))r-=1460,st.yr+=4;else r-=1461,st.yr+=4;}}else{int tmp=r/146097;r-=tmp*146097,st.yr+=400*tmp;}}else{if(st.yr==1582&&r>276)r+=10;if(check(st.yr)==1)r-=366,st.yr++;else r-=365,st.yr++;}}if(st.yr>=0&&!flag)st.yr++,flag=1;}while(r){if(check(st.yr)==1&&st.mh==2&&st.dy==29)st.mh++,st.dy=1;else if(check(st.yr)==0&&st.mh==2&&st.dy==28)st.mh++,st.dy=1;else if(st.dy==31&&(st.mh==12||st.mh==1||st.mh==3||st.mh==5||st.mh==7||st.mh==8||st.mh==10)){st.mh++,st.dy=1;if(st.mh==13)st.yr++,st.mh=1;}else if(st.dy==30&&(st.mh==4||st.mh==6||st.mh==9||st.mh==11))st.mh++,st.dy=1;else st.dy++;if(st.yr==0)st.yr++;if(st.yr==1582&&st.mh==10&&st.dy==5)st.dy=15;r--;}if(st.yr<0)printf("%d %d %d BC\n",st.dy,st.mh,-st.yr);else printf("%d %d %d\n",st.dy,st.mh,st.yr);}return 0;
}
/*
366+365+365+365=1461
*/
谢谢!!
[CSP2020]儒略日相关推荐
- matlab julian day,通用的日期格式与儒略日(julian day)格式的互相转换
通用的日期格式与儒略日(julian day)格式的互相转换 李文军 中国地震局地震预测研究所北京100036 liwj@http://www.doczj.com/doc/f68d7eabdd3383 ...
- Delphi 计算儒略日(Julian day)的代码
将开发过程中比较好的一些内容做个备份,下面内容段是关于Delphi 计算儒略日(Julian day)的内容,应该对大伙也有用途. function julday(year,month,day:int ...
- oracle解析儒略日,利用to_char获取当前日期准确的周数!
总的来说周数的算法有两种: 算法一:iw算法,每周为星期一到星期日算一周,且每年的第一个星期一为第一周,就拿2014年来说,2014-01-01是星期三,但还是算为今年的第一周,可以简单的用sql函数 ...
- 儒略日(CSP S2 第一题)
儒略日 题目 为了简便计算,天文学家们使用儒略日(Julian day)来表达时间. 所谓儒略日,其定义为从公元前 4713年 1 月 1 日正午 12点到此后某一时刻间所经过的天数,不满一天者用小数 ...
- Cesium中的儒略日JulianDate
在天文和卫星轨道计算中,有关儒略日的计算是一个绕不开的话题.本章阐述下Cesium中有关儒略日的处理方法. 涉及到的时间系统,如UTC,TAI等,这里不再详细阐述,读者自行阅读专业书籍或者网上查询. ...
- matlab日期转儒略历,matlab儒略日转为日期
Matlab数据类型及转换 (2011-05-16 15:10:59)转载▼标签: 杂谈 分类: 备忘录 Matlab中有15种基本数据类型,主要是整型.浮点.逻辑.字符.日期和时间.结构...... ...
- C++修正儒略日转UTC时间
C++修正儒略日转UTC时间 例如: unsigned int mjd = 0xd3e5; 可用下述函数转化为Y = 2007, M = 5, D = 25,代表2007年5月25日. unsigne ...
- 公历与儒略日的相互转化
做作业的时候需要把数据进行转化,做了两个儒略日和公历相互转换的函数,作为日常的记录,共勉之! 函数的主要功能时将儒略日进行转换,儒略日的起点订在公元前4713年(天文学上记为 -4712年)1月1日格 ...
- 儒略日转公历 以及 公历转儒略日(python版)
作为一个测绘专业的学生,经常需要儒略日,年积日,GPS周秒等的时间转换. 写了个小函数方便每次的转换时间,利用的是列表形式 mjd2cal() 函数是简化儒略日计算公历年月日时分秒,输入简化儒略日(含 ...
最新文章
- eclipse或者myeclipse的代码提示功能
- .NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接
- centos6.x安装mysql5.6及启动多实例
- 如何改善mysql数据装载操作效率的方法_详述如何提高MySQL中数据装载效率
- Codeforces Global Round 11——E随机+线性基待补
- LeetCode 414. Third Maximum Number
- python处理pdf实例_python实现pdf转word的例子
- 爆一个VS2015 Update1更新带来的编译BUG【已有解决方案】
- Web在线3D编辑器-全场景编辑全新功能升级
- 飞鸽传书 linux,飞鸽传书Linux版
- Devc++- 源文件未编译”
- 花卉培育信息管理系统设计与实现
- 计算机二级备考:Word 部分_3 表格 长文档综合排版 文档 共享
- 提升算法数据结构的几个网站
- BrowserslistError:E\ysg_front contains both .browserslistrc and browserslist
- 收集的css动画效果
- 盘点2010年娱乐圈十大重磅事件
- Cornerstone忽略不必要的文件
- 仪器规范接地与测量安全
- 网站分析平台:百度统计、谷歌统计、网数星,统计平台怎样选择?