WA40 蒟蒻求助 玄关
查看原帖
WA40 蒟蒻求助 玄关
688417
Karieciation楼主2024/7/21 10:28
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
ll x,days[7],year,month,day;
ll _4y()
{
	return 365*4+1;
}
ll _100y()
{
	return _4y()*25-1;
}
ll _400y()
{
	return _100y()*4+1;
}
ll _1y1m1d()
{
	return _4y()*(4712/4)+366;
}
ll _1582y1m1d()
{
	return _1y1m1d()+_4y()*(1580/4)+365;
}
ll _1582y10m4d()
{
	int t=_1582y1m1d()+3;
	for(int i=1;i<=9;i++)
		t+=months[i];
	return t;
}
ll _1582y10m15d()
{
	return _1582y10m4d()+1;
}
ll _1582y11m1d()
{
	return _1582y10m15d()+17;;
}
ll _1583y1m1d()
{
	return _1582y11m1d()+61;
}
ll _1601y1m1d()
{
	return _1583y1m1d()+_4y()*4+731;
}
bool check(ll n)
{
	if(n%400==0||n%4==0&&n%100)
		return true;
	return false;
}
void change(int q)
{
	x-=days[q];
	ll t,tt;
	switch(q)
	{
		case 0:
			year=1601,month=1,day=1;
			t=x/_400y()*400;
			x-=t/400*_400y();
			tt=x/_100y()*100;
			t+=tt;
			x-=tt/100*_100y();
			tt=x/_4y()*4;
			t+=tt;
			x-=tt/4*_4y();
			tt=x/365;
			t+=tt;
			x-=tt*365;
			year+=t;
			if(check(year-1))
				year--,x=365;
			for(;months[month]<=x;month++)
			{
				x-=months[month];
				if(month==2&&check(year))
					x--;
				if(x<0)
				{
					x=28,month=2;
					break;
				}
			}
			break;
		case 1:
			year=1583,month=1,day=1;
			if(x>365)
			{
				x-=365,year++;
				if(x>366)
				{
					x-=366,year++;
					t=x/_4y()*4;
					x-=t/4*_4y();
					tt=x/365;
					x-=tt,t+=tt;
					if(tt==4)
						t--,x=365;
					year+=t;
				}
			}
			for(;months[month]<=x;month++)
			{
				x-=months[month];
				if(month==2&&year%4==0)
					x--;
				if(x<0)
				{
					x=28,month=2;
					break;
				}
			}
			break;
		case 2:
			year=1582,month=11,day=1;
			for(;months[month]<=x;month++)
				x-=months[month];
			break;
		case 3:
			year=1582,month=10,day=15+x;
			break;
		case 4:
			year=1582,month=10,day=4;
			break;
		case 5:
			year=1582,month=1,day=1;
			for(;month<=9&&months[month]<=x;month++)
				x-=months[month];
			break;
		case 6:
			month=1,day=1;
			t=x/_4y()*4;
			x-=t/4*_4y();
			tt=x/365;
			x-=tt*365;
			t+=tt;
			if(tt==4)
				t--,x=365;
			year=t+1;
			for(;months[month]<=x;month++)
			{
				x-=months[month];
				if(month==2&&year%4==0)
					x--;
				if(x<0)
				{
					x=28,month=2;
					break;
				}
			}
			break;
	}
	day+=x;
}
int main()
{
	freopen("julian.in","r",stdin);
	freopen("julian.out","w",stdout);
	days[0]=_1601y1m1d(),days[1]=_1583y1m1d(),days[2]=_1582y11m1d(),days[3]=_1582y10m15d();
	days[4]=_1582y10m4d(),days[5]=_1582y1m1d(),days[6]=_1y1m1d();
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lld",&x);
		year=-4713,month=1,day=1;
		for(int i=0;i<7;i++)
		{
			if(x<days[i])
				continue;
			change(i);
			break;
		}
		if(year==-4713)
		{
			year=-year;
			ll t=x/_4y()*4,tt;
			x-=t/4*_4y(),tt=(x-1)/365;
			if(tt)
				x-=tt*365+1,t+=tt;
			year-=t;
			for(;months[month]<=x;month++)
			{
				x-=months[month];
				if(month==2&&year%4==1)
					x--;
				if(x<0)
				{
					x=28,month=2;
					break;
				}
			}
			day+=x;
			printf("%lld %lld %lld BC\n",day,month,year);
		}
		else
			printf("%lld %lld %lld\n",day,month,year);
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}

这是代码,5~10点WA(希望大家能看不懂)

2024/7/21 10:28
加载中...