题目描述

为了简便计算,天文学家们使用儒略日(Julian day)来表达时间。所谓儒略日,其定义为从公元前 4713 年 1 月 1 日正午 12 点到此后某一时刻间所经过的天数,不满一天者用小数表达。若利用这一天文学历法,则每一个时刻都将被均匀的映射到数轴上,从而得以很方便的计算它们的差值。

现在,给定一个不含小数部分的儒略日,请你帮忙计算出该儒略日(一定是某一天的中午 12 点)所对应的公历日期。

我们现行的公历为格里高利历(Gregorian calendar),它是在公元 1582 年由教皇格里高利十三世在原有的儒略历(Julian calendar)的基础上修改得到的(注:儒略历与儒略日并无直接关系)。具体而言,现行的公历日期按照以下规则计算:

  1. 公元 1582 年 10 月 15 日(含)以后:适用格里高利历,每年一月31天、 二月28天或29天、三月31 天、四月30天、五月31天、六月 30天、七月31天、八月31天、九月30 天、十月31天、十一月30 天、十二月31天。其中,闰年的二月为29天,平年为28天。当年份是400的倍数,或日期年份是4的倍数但不是100的倍数时,该年为闰年。
  2. 公元 1582 年 10 月 5 日(含)至 10 月 14 日(含):不存在,这些日期被删除,该年 10 月 4 日之后为 10 月 15 日。
  3. 公元 1582 年 10 月 4 日(含)以前:适用儒略历,每月天数与格里高利历相同,但只要年份是 44 的倍数就是闰年。
  4. 尽管儒略历于公元前 45 年才开始实行,且初期经过若干次调整,但今天人类习惯于按照儒略历最终的规则反推一切 1582 年 10 月 4 日之前的时间。注意,公元零年并不存在,即公元前 1 年的下一年是公元 1 年。因此公元前 1 年、前 5 年、前 9 年、前 13 年……以此类推的年份应视为闰年。

输入格式

第一行一个整数 Q,表示询问的组数。
接下来 Q 行,每行一个非负整数 r_i​,表示一个儒略日。

输出格式

对于每一个儒略日 r_i​,输出一行表示日期的字符串 s_i​。共计 Q 行。 s_i​ 的格式如下:

  1. 若年份为公元后,输出格式为 Day Month Year。其中日(Day)、月(Month)、年(Year)均不含前导零,中间用一个空格隔开。例如:公元 2020 年 11 月 7 日正午 12 点,输出为 7 11 2020
  2. 若年份为公元前,输出格式为 Day Month Year BC。其中年(Year)输出该年份的数值,其余与公元后相同。例如:公元前 841 年 2 月 1 日正午 12 点,输出为 1 2 841 BC

输入输出样例

输入 #1                                                        

3
10
100
1000

输出 #1

11 1 4713 BC
10 4 4713 BC
27 9 4711 BC

输入 #2

3
2000000
3000000
4000000

输出 #2

14 9 763
15 8 3501
12 7 6239

解题思路:

考虑二分年份mid,考察mid.1.1距离BC 4713.1.1的距离,剩余的日期我们暴力跳
  问题转化为了算mid年到BC 4713年的总天数
  这里有一个trick就是我们先把公元前的年份往前平移一年,即把BC 4713到BC 1年,平移到        4712到0年,最后算完年份再减一下,这样计算会方便很多
  那么则有 总天数=365×年数(也就是mid+4712)+闰年数量-10×[mid>1582]
  对于闰年数量,就不用讲了,都会计算
  那就算完了,注意long long以及二分边界即可。

代码如下:

#include<bits/stdc++.h>
#define itn int
#define tin int
#define tni int
#define nit int
#define nti int
#define ll long long
using namespace std;int read()
{int x = 0, f = 1; char ch = getchar();while (ch < '0' || ch>'9'){if (ch == '-')f = -1;ch = getchar();}while (ch >= '0' && ch <= '9')x = (x << 3) + (x << 1) + ch - '0', ch = getchar();return x * f;
}
ll readll()
{ll x = 0, f = 1; char ch = getchar();while (ch < '0' || ch>'9'){if (ch == '-')f = -1; ch = getchar();}while (ch >= '0' && ch <= '9')x = (x << 3) + (x << 1) + ch - '0', ch = getchar();return x * f;
}
const int dom[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int y = -4737, m = 1, d = 1;
int isRUN(int y)
{if (y <= 0){y = -y;return y % 4 == 1;}if (y <= 1582)return y % 4 == 0;return (y % 400 == 0) || ((y % 4 == 0) && (y % 100 != 0));
}
void getnxtday()
{d++;if (y == 1582 && m == 10 && d == 5)d = 15;if (d > dom[m] + (m == 2 && isRUN(y)))m++, d = 1;if (m > 12)y++, m = 1;
}
ll checkday(int x)
{ll day = 1ll * (x + 4712) * 365;if (x > 1582)day -= 10;day += 1ll * (x + 4712 + 3) / 4;if (x >= 1600){x -= 1601;day -= (ll)x / 100ll;day += (ll)x / 400ll;}return day;
}
int main()
{int T;T = read();while (T--){y = 0; m = d = 1;ll n = readll();int l = -4712, r = 1e9 + 1;while (l <= r){int mid = (l + r) / 2;if (checkday(mid) <= n){y = mid;l = mid + 1;}else r = mid - 1;}n -= checkday(y);if (y <= 0)y--;while (n--)getnxtday();printf("%d %d ", d, m);if (y <= 0)printf("%d BC\n", -y);elseprintf("%d\n", y);}return 0;
}

AC!

撒花

csp-s2020 儒略日(含源代码)相关推荐

  1. DFA的构造C语言,DFA的编程实现含源代码实验报告剖析

    <DFA的编程实现含源代码实验报告剖析>由会员分享,可在线阅读,更多相关<DFA的编程实现含源代码实验报告剖析(20页珍藏版)>请在人人文库网上搜索. 1.实验一(一)程序设计 ...

  2. C语言会场安排问题贪心算法,贪心算法解决会场安排问题多处最优服务次序问题(含源代码).doc...

    贪心算法解决会场安排问题多处最优服务次序问题(含源代码) 西 安年月日-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源 ...

  3. 基于python学生考勤_学生考勤系统(含源代码).pdf

    网页 资讯 视频 图片 知道 文库 贴吧 采购 地图 | 百度首页 登录 加入VIP 意见反馈 下载客户端 7/7/2019 C++学生考勤系统(含源代码) - 百度文库 计算机应用技术系课程设计报告 ...

  4. 学生成绩管理系统html代码,学生成绩管理系统(含源代码)30.doc

    学生成绩管理系统(含源代码)30 西安邮电学院 高级语言课程设计报告 题 目: 学 生 成 绩 管 理 系 统 系部名称 : 电子信息与工程系 专业名称 : 电子科学与技术 班 级 : 科技0701 ...

  5. 视频教程-10分钟搞定 php+H5手机网页微信支付 在线视频教程(含源代码)-微信开发

    10分钟搞定 php+H5手机网页微信支付 在线视频教程(含源代码) 04年进入计算机行业.拥有6年net和php项目开发经验,8年java项目开发经验. 现前端全栈工程师,主攻产品设计,微信开发等. ...

  6. 家族查询系统c语言源程序,家谱管理系统(含源代码).docx

    家谱管理系统(含源代码) 家谱管理系统--C语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结 ...

  7. 【归档】爬取马蜂窝景点信息(含源代码)

    爬取马蜂窝景点信息(含源代码) 爬取热门目的地信息 MafengwoCrawler()._get_mdd() 爬取目的地内景点信息 MafengwoCrawler().crawler_mdd() 爬取 ...

  8. 大学生考勤系统C语言代码,C++学生考勤系统(含源代码)

    <C++学生考勤系统(含源代码)>由会员分享,可在线阅读,更多相关<C++学生考勤系统(含源代码)(26页珍藏版)>请在人人文库网上搜索. 1.C+吾言程序设计课程设计报告书题 ...

  9. 视频教程-微信小程序商城-界面设计实战教学(含源代码)-微信开发

    微信小程序商城-界面设计实战教学(含源代码) 04年进入计算机行业.拥有6年net和php项目开发经验,8年java项目开发经验. 现前端全栈工程师,主攻产品设计,微信开发等. 黄菊华 ¥90.00 ...

最新文章

  1. 卷积神经网络中十大拍案叫绝的操作!
  2. Ubuntu安装.run文件
  3. 选择问题 and 字谜游戏问题
  4. Java 原子类的操作 AtomicInteger
  5. .Net+MySQL组合开发(二) 数据访问篇
  6. Centos 搭建 NFS
  7. 剑指offer——圆圈中最后剩下的数字
  8. 【续上篇】推荐一款液晶电视测试软件
  9. python中使用连续关系运算符_解释一下Python中的关系运算符
  10. POJ3254 Corn Fields(状态压缩DP)
  11. python学习笔记第三节
  12. matlab43个神经网络分析代码,《MATLAB 神经网络43个案
  13. 网卡 的linux驱动精灵,下载:Intel PRO100/1000网卡驱动13.0版
  14. 手机上万里挑一的CAD看图软件,好用到颠覆你的世界观!
  15. win10c盘扩容_【网赚教程】2020最新百度网盘扩容技术,适合做虚拟资源项目和业务!...
  16. 修复win7更新服务器失败,win7的windows update无法启动,手动在服务里启动提示“错误2:系统找不到指定文件...
  17. mysql lsl_GitHub - LSL-Git/MyBatis_Dynamic_SQL: mybatis 动态SQL使用
  18. 计算机组成原理——Part Three 性能指标
  19. (三)苏世民:我的经验和教训:追梦(3)
  20. 调用系统相机和相册出现闪退报错No Activity found to handle Intent

热门文章

  1. VUE使用document.onkeydown键盘的监听与移除
  2. 基于AKF可扩展模型的微服务拆分方式
  3. 高数考研归纳 - 微分学 - 一元微分学
  4. 数据结构——有序链表的合并,链表实现一元多项式相加
  5. 面向对象三大特性及关键字
  6. 绝对值函数abs、fabs等的使用
  7. atoi()函数的实现
  8. Python生成英文大小写和数字的随机数
  9. C语言自定义数组函数
  10. 精灵图(雪碧图)的好处