#include<bits/stdc++.h>
#define int long long
#define For(i,A,B) for(int i=A;i<=B;i++)
using namespace std;
int T,x;
int month[15]= {29,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int x) {
if(x%400==0||(x%4==0&&x%100!=0)) return 1;
return 0;
}
signed main() {
cin>>T;
while(T--) {
month[2]=28;
cin>>x;
if(x>2299161) x+=10;
int N=x/146097;
int y=-4713+N*400;
if(y>1) y++;
x-=N*146097;
x++;
for(; x>366; y++) {
int f=0;
if(y==0) y++;
if(y>=1) f=check(y);
else f=check(-y-1);
if(f) x-=366;
else x-=365;
}
int yue=1;
int f=0;
if(y>=1) f=check(y);
else f=check(-y-1);
if(f) month[2]=29;
for(; yue<=12&&x>month[yue]; yue++) {
x-=month[yue];
}
cout<<x<<' '<<yue<<' '<<abs(y);
if(y<0) cout<<" BC";
cout<<endl;
}
return 0;
}
思路:因为每 400 年天数相同,所以先确定这个天数在哪个400年里,然后这400年暴力匹配,直到剩不到1年,然后这365天再暴力。
问题:确定在这个400年的天数时错误,如 2000000 我的代码认为是第 14 个 400 年的第 100740 天,但不对。