50pts求助...
查看原帖
50pts求助...
109222
一啦啦啦一楼主2020/11/16 14:25

每个数据天数都少一天...

#include <iostream>
#include <cstdio>
using namespace std;
long long q,r,d,m,y;
int a[14]={0,31,28,31,30,31,30,31,31,30,31,30,31,50};
int gy=-1;

bool rn(long long x)
{
	if(x>=0)
	{
		if(x>1582)
		{
			if(x%400==0) return 1;
			if(x%100!=0&&x%4==0) return 1;
			return 0;
		}
		else if((x+1)%4==0) return 1;
		else return 0;
	}
	else {
		if((-x-1)%4==0) return 1;
		return 0;
	}
}

void cal0()
{
	int i=1;
	while(r>=a[i]&&i<=12)
	{
		r-=a[i];
		m++;
		if(i==2&&rn(y)) r--;
		if(r<0) r++,r+=a[i],m--; //
		i++;
	}
	if(r<a[i]) d+=r,r=0;
	else y++,m=1;
}

void cal1()
{
	if(r>=17) r-=17,d=1,m=11;
	while(r>365)
	{
		if(rn(++y)) r-=366;
		else r-=365;
	}
	if(r>=365&&!rn(y+1)) r-=365,++y;
	int i=11,j=0;
	while(r>=a[i]&&j<=12)
	{
		r-=a[i];
		m++;
		if(m==13) m-=12,y++,i=0;
		if(i==2&&rn(y)) r--;
		if(r<0) r++,r+=a[i],m--; //
		i++;j++;
	}
	if(r<a[i]) d+=r,r=0;
}

void cal2()
{
	while(r>365)
	{
		if(rn(y)) r-=366,y++;
		else r-=365,y++;
	}
	if(r>=365&&!rn(y)) r-=365,++y;
	int i=1;
	while(r>=a[i]&&i<=12)
	{
		r-=a[i];
		m++;
		if(i==2&&rn(y)) r--;
		if(r<0) r++,r+=a[i],m--; //
		i++;
	}
	if(r<a[i]) d+=r,r=0;
}

int main()
{
	scanf("%lld",&q);
	while(q--)
	{
		scanf("%lld",&r);
		d=1,m=1,y=-4713;
		cal0();
		if(r>0)
		{
			if(r<2298795) y+=(r/1461)*4,r%=1461,cal2();
			else if(r==2298795) d=4,m=10,y=1582;
			else if(r>=2298796&&r<2305082) d=15,m=10,y=1582,r-=2298796,cal1();
			else if(r==2305082) d=1,m=1,y=1600;
			else if(r>2305082) d=1,m=1,y=1600,r-=2305082,y+=(r/146097)*400,r%=146097,cal2();
			if(y>=0&&y<1582) y++;
		}
		while(m>12) m-=12,y++;
		while(d>a[m]&&m<=12)
		{
			if(m==2&&rn(y)) if(d<=29) break;
			else d--;
			d-=a[m];
			m++;
			if(m>12) m-=12,y++;
		}
		printf("%lld %lld ",d,m);
		if(y<0) printf("%lld BC\n",-y);
		else printf("%lld\n",y);
	}
	return 0;
}
2020/11/16 14:25
加载中...