Loading

儒略日

模拟题,放一个好实现的代码。

#include <bits/stdc++.h>
using namespace std;
const int N = 3e6 + 10;
typedef long long ll;
typedef pair<int, int> pii;
int T, n, ans[N][3];
int d1, d2, d3 = 3000000;
int getDay(int y, int m) {
    if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) return 31;
    if (m == 4 || m == 6 || m == 9 || m == 11) return 30;
    if (y < 0) y++;
    if (y <= 1582) return y % 4 == 0 ? 29 : 28;
    else return ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) ? 29 : 28;
}
void nextDay(int &y, int &m, int &d) {
    if (y == 1582 && m == 10 && d == 4) {
        d = 15;
        return ;
    }
    if (d < getDay(y, m)) d++;
    else {
        d = 1;
        if (m == 12) {
            m = 1;
            if (y == -1) y = 1;
            else y++;
        } else m++;
    }
}   
int main() {
    int y = -4713, m = 1, d = 1;
    for (int i = 0; i <= d3; i++) {
        ans[i][0] = y, ans[i][1] = m, ans[i][2] = d;
        if (y == 1600 && m == 1 && d == 1) d1 = i;
        if (y == 2000 && m == 1 && d == 1) d2 = i - d1; //周期
        nextDay(y, m, d);
    }
    scanf("%d", &T);
    while (T--) {
        ll x;
        scanf("%lld", &x);
        if (x <= d3) {
            if (ans[x][0] < 0) printf("%d %d %d BC\n", ans[x][2], ans[x][1], -ans[x][0]);
            else printf("%d %d %d\n", ans[x][2], ans[x][1], ans[x][0]);
        } else {
            ll t = (x - d1) / d2, y = x - t * d2;
            
            printf("%d %d %lld\n", ans[y][2], ans[y][1], ans[y][0] + 400 * t);
        }
    }
    return 0;
}
posted @ 2025-12-17 15:37  循环一号  阅读(1)  评论(0)    收藏  举报