已经肝了好多天了,今天又做了一个多小时,还是90。
错误数据:
输入:114580112277
我的输出:29 2 313704800
标准输出:29 2 313704980
我要崩了啊...
#include<bits/stdc++.h>
using namespace std;
long long x,d,m,y,yea[5000005],t;
struct dateee
{
int mm;
int dd;
};
struct datee
{
int yy;
int mm;
int dd;
};
dateee md[500];
datee mdd[200005];
bool rn_julian(int y)
{
if(y<0)
{
if(abs(y)%4==1)return true;
else return false;
}
else
{
if(y%4==0)return true;
else return false;
}
}
bool rn_greg(int y)
{
if(y%4==0&&(y%100!=0||y%400==0))return true;
else return false;
}
bool rn_judge(int y)
{
if(y<=1582)
{
if(rn_julian(y))return true;
else return false;
}
else
{
if(rn_greg(y))return true;
else return false;
}
}
void maketable1()//算出每年1月1日的儒略日数
{
long long datee=0;
for(int i=-4713;i<=4500000;i++)
{
yea[i+4714]=datee;
if(i==0)
{
continue;//没有0年
}
if(i!=1582)
{
if(rn_judge(i))datee+=366;//闰年
else datee+=365;//平年
}
else if(i==1582)
{
datee+=355;
}
}
}
void maketable2()//算出一年的具体一天是几月几日
{
m=1;
d=0;
for(int i=1;i<=400;i++)
{
if(m==12&&d==31)break;
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
{
if(d==31)
{
m++;
d=1;
}
else d++;
}
else if(m==4||m==6||m==9||m==11)
{
if(d==30)
{
m++;
d=1;
}
else d++;
}
else
{
if(d==28)
{
d=1;
m++;
}
else d++;
}
md[i].mm=m;
md[i].dd=d;
}
//特判2月29日
md[405].mm=2;
md[405].dd=29;
}
void maketable3()//400年内的每一天
{
int ddate=0;
for(int i=1;i<=400;i++)
{
bool flag=false;
for(int j=1;j<=366;j++)
{
if((!rn_judge(i+1600))&&j==366)break;//平年只有365天
ddate++;
if(j==60&&rn_judge(i+1600))
{
mdd[ddate].dd=29;
mdd[ddate].mm=2;
flag=true;
continue;
}
if(flag)
{
mdd[ddate].dd=md[j-1].dd;
mdd[ddate].mm=md[j-1].mm;
mdd[ddate].yy=i;
continue;
}
mdd[ddate].dd=md[j].dd;
mdd[ddate].mm=md[j].mm;
mdd[ddate].yy=i;
}
}
}
int main()
{
//freopen("P7075_10.in","r",stdin);
//freopen("P7075_10.ans","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
maketable1();
maketable2();
maketable3();
/*for(int i=1;i<=100;i++)
{
cout<<yea[i]<<" ";
}*/
/*for(int i=1;i<=365;i++)
{
cout<<"第"<<i<<"天 "<<md[i].dd<<" "<<md[i].mm<<"\n";
}*/
//return 0;
long long ans;
cin>>t;
while(t--)
{
cin>>x;
if(x<=1000000005)
{
long long num=min(1LL*4555555,x/300+1);
y=upper_bound(yea+1,yea+num+1,x)-yea-1;//定年
if(y==0)y=1;
long long cha=x-yea[y]+1;
//cout<<abs(y-4714)<<"\n";
if(rn_judge(y-4714))
{
//cout<<"ok\n";
if(cha<60)ans=cha;
else if(cha==60)ans=405;//2月29日
else ans=cha-1;
}
else ans=cha;
if(y-4714==1582)
{
if(cha<278)ans=cha;
else ans=cha+10;
//cout<<cha<<"\n";
//处理溢出
if(ans>365)
{
y++;
ans-=365;
}
}
//cout<<ans<<"\n";
if(y-4714<0)cout<<md[ans].dd<<" "<<md[ans].mm<<" "<<abs(y-4714)<<" BC\n";
else cout<<md[ans].dd<<" "<<md[ans].mm<<" "<<y-4714<<"\n";
}
else
{
x-=2305813;
long long zhouqi_start;
zhouqi_start=x/146097;
x-=zhouqi_start*146097;
//cout<<x<<" ";
cout<<mdd[x].dd<<" "<<mdd[x].mm<<" "<<mdd[x].yy+zhouqi_start*400+1600<<"\n";
}
}
return 0;
}