CSP-S2020 T1 儒略日

CSP-S2020 T1 儒略日

洛谷传送门

如有同名,那是小号!!!!


正解:

首先分析题目:

1. 得到 常量

① 格里高利历 400 年的天数为 146097

4713.1.1 ~ 1582.10.4 的天数为 2299160   算的时候记得减去88

方法如下

int n, ans = 0;
scanf("%d", &n);
ans += (n / 4) * 366;
ans += (n - (n / 4)) * 365;


③ 儒略历 4 年的天数 ___1461___ 手算即可

4713.1.1 ~ 1200.1.1 的儒略日 2159351


2. 判断历法时 如果 ri <= 2299160 那么必定是儒略日


剩下的看代码吧

#include <cstdio>

#define IL inline

typedef long long ll;

const int Geli = 146097; // 格里高利历 400 年的天数
const int Rulian = 1461; // 儒略日 4 年的天数

int T;
int day[Geli], month[Geli], year[Geli];
/*
    day[i] : 格里高利历 400 年天数
    month[i] : 格里高利历 400 年月数
    year[i] : 格里高利历 400 年年数
*/
ll n, t;

IL int check(int y, int m)
{
    if (m == 2) {
        return y % 4 ? 28 : y % 100 ? 29 : y % 400 ? 28 : 29;
        /*
        * 可以简单理解为 
        * if year % 4:
        *      if year % 100:
        *          return 28
        *      else:
        *          return 29
        * else if year % 400:
        *      return 29
        * else:
        *      return 28
        * */
    }
    return m == 4 || m == 6 || m == 9 || m == 11 ? 30 : 31;
}

int main()
{
    month[0] = day[0] = 1;
    for (int i = 1; i < Geli; i ++) {
        day[i] = day[i - 1] + 1; // 模拟天数增长
        month[i] = month[i - 1]; // 不到 30天 或 31天 月数不变
        year[i] = year[i - 1]; // 不到 365天 或 366天 年数不变
        if (day[i] > check(year[i], month[i])) { // 新的一个月开始了~!
            month[i] ++;
            day[i] = 1;
        }
        if (month[i] > 12) { // 新的一年开始了~!
            year[i] ++;
            month[i] = 1;
        }
    }
    scanf("%d", &T);
    while(T --) {
        scanf("%lld", &n);
        if (n > 2299160) { // 是格里高利历
            n -= 2159351;
            t = n / Geli * 400 + 1200; // 以1200年为起点 n / 格里高利历 得到有几个 400 年,再乘回去
            n %= Geli; // 抹去有几个格里高利历
        } else {
            t = n / Rulian * 4 - 4712; // 同上
            n %= Rulian;
        }
        if (t + year[n] > 0) {
            printf("%d %d %lld\n", day[n], month[n], t + year[n]);
        } else {
            printf("%d %d %lld BC\n", day[n], month[n], 1 - t - year[n]);
        }
    }
    return 0;
}

posted @ 2021-06-04 15:30  Haruka^  阅读(189)  评论(0)    收藏  举报