多一天少一天的问题很严重,加上判断1584后闰年的机制,只剩10分了
#include <bits/stdc++.h>
using namespace std;
int q,r,y,m=1,d;
int monthdays2[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31};
bool ifrun(int y) {
return !((y-1)%4);
}
int main() {
ios::sync_with_stdio(false);
cin>>q;
do {
int tsp=0;
monthdays2[2]=29;
m=1;
y=4713;
cin>>r;
int i=1;
while(r>=366){ //先减年
y--;
if(y>=-1584){
if(ifrun(y))r-=366;
else r-=365;
}
else{
if(abs(r)%100==0&&abs(r)%400!=0)r-=365;//百年不闰
else if(abs(r)%400==0)r-=366;//四百年又闰
else r-=365;
}
}
while(monthdays2[i]<=r) { //当还可以减去整月
r-=monthdays2[i];//减去
i++;
if(i>12) { //如果超过12月
y--;
if(!ifrun(y))monthdays2[2]=28; //更改2月
else monthdays2[2]=29;
i=1;//因为前面减年可能剩下365天,所以要判断加年
}
}
if(y<-1584)r+=11;//大于1584,无条件加11天
if(y==-1584) {//1584
if(i>10)r+=11;
if(i==10) {
if(r>=4)r+=11;
}
}
if(r>monthdays2[i]) {//如果爆月份
r-=monthdays2[i];
i++;
}
if(y>0) {//BC
cout<<r+1<<" "<<i<<" "<<y<<" BC\n";
continue;
}
if(y<0) {//AD
y=-y+1;
}
cout<<r+1<<" "<<i<<" "<<y<<"\n";
} while(--q);
}