儒略日
模拟题,放一个好实现的代码。
#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;
}

浙公网安备 33010602011771号