0pts玄关求调(代码有注释) orz
查看原帖
0pts玄关求调(代码有注释) orz
586417
Bz_nnn楼主2024/7/23 08:47
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 1e5 + 5;
const ll m0[N] = {31,28,31,30,31,30,31,31,30,31,30,31};
const ll m1[N] = {31,29,31,30,31,30,31,31,30,31,30,31};
//j表示Julian calendar,g表示Gregorian calendar
ll Q, r, jc, gs, dj, dg;
bool t[N];//t:是否为闰年
ll sum[N];//G历天数的前缀和
struct node{
    bool bc;
    ll day;//距公元一年1月1日的天数
};
struct date{
    ll year, month, day;
};
ll lower_boundx(ll x){
    ll l = 1, r = 400, mid;
    while(l <= r){
        mid = (l + r) / 2;
        if(sum[mid] >= x) r = mid - 1;
        else l = mid + 1;
    }
    return l;//**
}
date ru(ll r){//计算儒略历
    date ans;
    ll day_left;
    node time;
    time.bc = 0;
    time.day = 4713 * 365 + 1178 - r;//1178为4713年里闰年个数
    day_left = time.day % dj;
    ans.year = time.day / dj * 4 + day_left / 365 + 1;//不考虑闰年产生的误差一定不会影响年份
    ll a = 0;
    if(ans.year % 4 == 0){//这一年是闰年
        for(ll i = 0; i < 12; i++){
            a += m1[i];
            if(a >= day_left){
                ans.month = i+1;
                ans.day = day_left - (a - m1[i]);
                break;
            }
        }
    }else{//这一年不是闰年
        for(ll i = 0; i < 12; i++){
            a += m0[i];
            if(a >= day_left){
                ans.month = i+1;
                ans.day = day_left - (a - m0[i]);
                break;
            }
        }
    }
    return ans;
}
int main(){
    for(ll i = 1; i <= 1582; i++){
        jc += 365;
        if(i % 4 == 0) jc++;
    }
    jc += 308;//jc:公元1年1月1日距儒略历结束时间的天数
    gs = jc + 10;//gs:公元1年1月1日距G历开始时间的天数
    dj = 4 * 365 + 1;//儒略历四年一循环的总天数
    for(ll i = 1; i <= 400; i++){
        t[i*400] = 1;
        if((i*4%100) != 0) t[i*4] = 1;
    }
    for(ll i = 1; i <= 400; i++){
        sum[i] = sum[i-1] + t[i] + 365;
    }
    dg = sum[400];//G历400年一循环的总天数
    scanf("%lld", &Q);
    while(Q--){
        scanf("%lld", &r);
        node time;
        if(r <= 4713 * 365 + 1178){//公元前,儒略历
            date ans = ru(r);
            printf("%lld %lld %lld BC\n", ans.day, ans.month, ans.year);
        }else{//公元后
            date ans;
            ll day_left;
            time.bc = 1;
            time.day = r - 4713 * 365 - 1178;
            if(time.day < jc){//儒略历 同上
                ans = ru(r);
                printf("%lld %lld %lld\n", ans.day, ans.month, ans.year);
            }else{
                r += 10;//有10天被删除**
                day_left = time.day % dg;
                ans.year = time.day / dg * 400;
                ans.year += lower_boundx(day_left);
                ll a = 0;
                if(ans.year % 400 == 0 || (ans.year % 4 == 0 && ans.year % 100 != 0)){//本年是闰年
                    for(ll i = 0; i < 12; i++){
                        a += m1[i];
                        if(a >= day_left){
                            ans.month = i+1;
                            ans.day = day_left - (a - m1[i]);
                            break;
                        }
                    }
                }else{//不是闰年
                    for(ll i = 0; i < 12; i++){
                        a += m0[i];
                        if(a >= day_left){
                            ans.month = i+1;
                            ans.day = day_left - (a - m0[i]);
                            break;
                        }
                    }
                }
                printf("%lld %lld %lld\n", ans.day, ans.month, ans.year);
            }
        }
    }
return 0;
}
2024/7/23 08:47
加载中...