儒略日

题解

其实是挺简单的一道模拟题,但对于笔者这种考场上打了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]儒略日相关推荐

  1. matlab julian day,通用的日期格式与儒略日(julian day)格式的互相转换

    通用的日期格式与儒略日(julian day)格式的互相转换 李文军 中国地震局地震预测研究所北京100036 liwj@http://www.doczj.com/doc/f68d7eabdd3383 ...

  2. Delphi 计算儒略日(Julian day)的代码

    将开发过程中比较好的一些内容做个备份,下面内容段是关于Delphi 计算儒略日(Julian day)的内容,应该对大伙也有用途. function julday(year,month,day:int ...

  3. oracle解析儒略日,利用to_char获取当前日期准确的周数!

    总的来说周数的算法有两种: 算法一:iw算法,每周为星期一到星期日算一周,且每年的第一个星期一为第一周,就拿2014年来说,2014-01-01是星期三,但还是算为今年的第一周,可以简单的用sql函数 ...

  4. 儒略日(CSP S2 第一题)

    儒略日 题目 为了简便计算,天文学家们使用儒略日(Julian day)来表达时间. 所谓儒略日,其定义为从公元前 4713年 1 月 1 日正午 12点到此后某一时刻间所经过的天数,不满一天者用小数 ...

  5. Cesium中的儒略日JulianDate

    在天文和卫星轨道计算中,有关儒略日的计算是一个绕不开的话题.本章阐述下Cesium中有关儒略日的处理方法. 涉及到的时间系统,如UTC,TAI等,这里不再详细阐述,读者自行阅读专业书籍或者网上查询. ...

  6. matlab日期转儒略历,matlab儒略日转为日期

    Matlab数据类型及转换 (2011-05-16 15:10:59)转载▼标签: 杂谈 分类: 备忘录 Matlab中有15种基本数据类型,主要是整型.浮点.逻辑.字符.日期和时间.结构...... ...

  7. C++修正儒略日转UTC时间

    C++修正儒略日转UTC时间 例如: unsigned int mjd = 0xd3e5; 可用下述函数转化为Y = 2007, M = 5, D = 25,代表2007年5月25日. unsigne ...

  8. 公历与儒略日的相互转化

    做作业的时候需要把数据进行转化,做了两个儒略日和公历相互转换的函数,作为日常的记录,共勉之! 函数的主要功能时将儒略日进行转换,儒略日的起点订在公元前4713年(天文学上记为 -4712年)1月1日格 ...

  9. 儒略日转公历 以及 公历转儒略日(python版)

    作为一个测绘专业的学生,经常需要儒略日,年积日,GPS周秒等的时间转换. 写了个小函数方便每次的转换时间,利用的是列表形式 mjd2cal() 函数是简化儒略日计算公历年月日时分秒,输入简化儒略日(含 ...

最新文章

  1. eclipse或者myeclipse的代码提示功能
  2. .NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接
  3. centos6.x安装mysql5.6及启动多实例
  4. 如何改善mysql数据装载操作效率的方法_详述如何提高MySQL中数据装载效率
  5. Codeforces Global Round 11——E随机+线性基待补
  6. LeetCode 414. Third Maximum Number
  7. python处理pdf实例_python实现pdf转word的例子
  8. 爆一个VS2015 Update1更新带来的编译BUG【已有解决方案】
  9. Web在线3D编辑器-全场景编辑全新功能升级
  10. 飞鸽传书 linux,飞鸽传书Linux版
  11. Devc++- 源文件未编译”
  12. 花卉培育信息管理系统设计与实现
  13. 计算机二级备考:Word 部分_3 表格 长文档综合排版 文档 共享
  14. 提升算法数据结构的几个网站
  15. BrowserslistError:E\ysg_front contains both .browserslistrc and browserslist
  16. 收集的css动画效果
  17. 盘点2010年娱乐圈十大重磅事件
  18. Cornerstone忽略不必要的文件
  19. 仪器规范接地与测量安全
  20. 网站分析平台:百度统计、谷歌统计、网数星,统计平台怎样选择?

热门文章

  1. CSS控制背景图片自适应表格大小
  2. 百度网盘登陆验证提示:无法访问此页面,或者二维码显示失败,弹窗显示:无法访问此页面,确保web地址。。。。
  3. Anbox源码分析(三)——Anbox渲染原理(源码分析)
  4. Unity实时GI与烘焙GI
  5. 微信小程序中使用画布canvas实现动态心电图绘制
  6. 论文投稿指南——中国(中文EI)期刊推荐(第6期)
  7. PPI的多模态融合预测
  8. java——集合详解
  9. C#删除word页眉页脚和最后一页
  10. 使用c#捕获usb扫描枪扫描二维码、条形码结果(支持中文版)