90分求改
查看原帖
90分求改
530797
code_hyx楼主2022/9/20 19:20

已经肝了好多天了,今天又做了一个多小时,还是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;	
} 
2022/9/20 19:20
加载中...