目前共有2篇帖子。 字體大小:較小 - 100% (默認)▼  內容轉換:不轉換▼
 
點擊 回復
23 1
C++ 根据儒略日计算实际日期
魔法學徒 一級
1樓 發表于:2025-5-11 21:56
#include <bits/stdc++.h>
using namespace std;

inline bool p_moon(long long n) {
    if (n < 0) {
        n++;
    }

    if (n <= 1582) {
        return (n % 4 == 0);
    }

    return ((n % 4 == 0 && n % 100 != 0) || n % 400 == 0);
}

inline long long get_m_d(int yr, int mt) {
    if (mt == 10 && yr == 1582) {
        return 21;
    }

    if (mt == 2) {
        return p_moon(yr) ? 29 : 28;
    }

    if (mt == 4 || mt == 6 || mt == 9 || mt == 11) {
        return 30;
    }

    return 31;
}

inline long long get_y_d(int yr) {
    if (yr == 1582) {
        return 355;
    }

    return p_moon(yr) ? 366 : 365;
}

constexpr long long four_b_y_d = 365 * 4 + 1, hd_b_y_d = four_b_y_d * 25 - 1, f_hd_b_y_d = hd_b_y_d * 4 + 1;

inline void f_hd_jump(long long& n, int& y, int maxn_year=INT_MAX) {
    const int py = min(n / f_hd_b_y_d, static_cast<long long>(maxn_year / 400));
    y += py * 400;
    n -= py * f_hd_b_y_d;
}

inline void hd_jump(long long& n, int& y, int maxn_year=INT_MAX) {
    const int py = min(n / hd_b_y_d, static_cast<long long>(maxn_year / 100));
    y += py * 100;
    n -= py * hd_b_y_d;
}

inline void four_jump(long long& n, int& y, int maxn_year=INT_MAX) {
    const int py = min(n / four_b_y_d, static_cast<long long>(maxn_year / 4));
    y += py * 4;
    n -= py * four_b_y_d;
}

inline bool year_jump(long long& n, int& y) {
    long long d = get_y_d(y);
    if (n >= d) {
        n -= d;
        y++;
        if (y == 0) {
            y = 1;
        }
        return true;
    }
    return false;
}

inline void jump_to_special(long long& n, int& y) {
    // fast to 1600
    if (n >= 2305448) {
        n -= 2305448;
        y = 1600;
        return;
    }

    if (n >= 365 * 4 + 1) {
        four_jump(n, y, 4713);
        while (year_jump(n, y) && y < 1) {}
    }
}


inline void special_judge(long long& n, int& y) {
    if (y == 1) {
        four_jump(n, y, 1580);
        while (year_jump(n, y) && y < 1584) {}

        if (y == 1584) {
            four_jump(n, y, 16);
        }
    }

    if (y == 1600) {
        year_jump(n, y);
        f_hd_jump(n, y);
        hd_jump(n, y, 399);
        four_jump(n, y, 99);
    }
}

inline void jump_year(long long& n, int& y) {
    while (true) {
        long long d = get_y_d(y);
        if (n < d) {
            return;
        }

        n -= d;
        y++;
    }
}

inline void jump_month(long long& n, int& y, int& m) {
    while (true) {
        long long d = get_m_d(y, m);
        if (n < d) {
            return;
        }

        n -= d;
        m++;
    }
}

inline void jump_day(long long& n, int& y, int& m, int& d) {
    if (!(y == 1582 && m == 10)) {
        d = n + 1;
        return;
    }

    d = n + 11;
}

inline void print(long long y, int m, int d) {
    if (y < 0) {
        cout << d << ' ' << m << ' ' << -y << " BC\n";
    } else {
        cout << d << ' ' << m << ' ' << y << "\n";
    }
}

inline void sol(long long n) {
    int yr = -4713, mt = 1, dy = 1;
    jump_to_special(n, yr);
    special_judge(n, yr);

    jump_year(n, yr);
    jump_month(n, yr, mt);
    jump_day(n, yr, mt, dy);

    print(yr, mt, dy);
}

int main() {
    cin.tie(nullptr);
    cout.tie(nullptr);
    ios::sync_with_stdio(false);

    int q;
    cin >> q;
    while (q--) {
        long long n;
        cin >> n;
        sol(n);
    }
    return 0;
}
魔法學徒 一級
2樓 發表于:2025-5-11 21:57
洛谷P7075
 

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:23 回複數:1
評論數: ?
作者:star
最後回復:star
最後回復時間:2025-5-11 21:57
 
©2010-2025 Purasbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。