天天看點

CSP-S2020 T1 儒略日

CSP-S2020 T1 儒略日

​​洛谷傳送門​​

為了簡便計算,天文學家們使用儒略日(Julian day)來表達時間。所謂儒略日,其定義為從公元前 4713 年 1 月 1 日正午 12 點到此後某一時刻間所經過的天數,不滿一天者用小數表達。若利用這一天文學曆法,則每一個時刻都将被均勻的映射到數軸上,進而得以很友善的計算它們的內插補點。

現在,給定一個不含小數部分的儒略日,請你幫忙計算出該儒略日(一定是某一天的中午 12 點)所對應的公曆日期。

我們現行的公曆為格裡高利曆(Gregorian calendar),它是在公元 1582 年由教皇格裡高利十三世在原有的儒略曆(Julian calendar)的基礎上修改得到的(注:儒略曆與儒略日并無直接關系)。具體而言,現行的公曆日期按照以下規則計算:

公元 1582 年 10 月 15 日(含)以後:适用格裡高利曆,每年一月 3131 天、 二月 2828 天或 2929 天、三月 3131 天、四月 3030 天、五月 3131 天、六月 3030 天、七月 3131 天、八月 3131 天、九月 3030 天、十月 3131 天、十一月 3030 天、十二月 3131 天。其中,閏年的二月為 2929 天,平年為 2828 天。當年份是 400400 的倍數,或日期年份是 44 的倍數但不是 100100 的倍數時,該年為閏年。

公元 1582 年 10 月 5 日(含)至 10 月 14 日(含):不存在,這些日期被删除,該年 10 月 4 日之後為 10 月 15 日。

公元 1582 年 10 月 4 日(含)以前:适用儒略曆,每月天數與格裡高利曆 相同,但隻要年份是 44 的倍數就是閏年。

盡管儒略曆于公元前 45 年才開始實行,且初期經過若幹次調整,但今天人類習慣于按照儒略曆最終的規則反推一切 1582 年 10 月 4 日之前的時間。注意,公元零年并不存在,即公元前 1 年的下一年是公元 1 年。是以公元前 1 年、前 5 年、前 9 年、前 13 年……以此類推的年份應視為閏年。

第一行一個整數 QQ,表示詢問的組數。

接下來 QQ 行,每行一個非負整數 r_ir**i​,表示一個儒略日。

對于每一個儒略日 r_ir**i,輸出一行表示日期的字元串 s_is**i。共計 QQ 行。 s_is**i 的格式如下:

若年份為公元後,輸出格式為 ​<code>​Day Month Year​</code>​。其中日(Day)、月(Month)、年(Year)均不含前導零,中間用一個空格隔開。例如:公元 2020 年 11 月 7 日正午 12 點,輸出為 ​<code>​7 11 2020​</code>​。

若年份為公元前,輸出格式為 ​<code>​Day Month Year BC​</code>​。其中年(Year)輸出該年份的數值,其餘與公元後相同。例如:公元前 841 年 2 月 1 日正午 12 點,輸出為 ​<code>​1 2 841 BC​</code>​。

絕對有能力在考場上調出滿分代碼。

但是挂了60分。

為什麼呢?

因為沒審題(微笑)。以為公元後就是按現在的方式計算閏年了,咋調都差12天。其實1582年之後才是按現在的方式計算閏年。

也不知道是審題不行,還是常識沒有。

反正就是SB。挂了60

如果知道是這裡的鍋,咋的這100是穩拿的。

就依題意模拟吧。每個人的方法可能都不一樣。我這裡的代碼碼了206行。在這裡問候一下出題人身體健康。

大體思路就是,先400 400數,再100 100數,再4年4年數,以此優化複雜度。

很多特判。

很多很多特判。

很多很多很多特判。

所有的數都是手算的。(出題人$%&amp;##)

代碼: