求救,1582年以后多了十三天?
查看原帖
求救,1582年以后多了十三天?
542719
Aiki_hr楼主2022/9/6 13:32

求救,1582年以后多了十三天? 样例第二个的后两个我的输出都比样例多了十三天。

#include<iostream>
#include<stdio.h>
#define ll long long
using namespace std;
ll n,m,a,b,c,d,T,year,month=0,day=0,tim;
ll pty[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
ll ry[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){
	cin>>T;
	while(T--){
		scanf("%d",&n);
		n++;
		if(n<=1721424){
			tim=0;
			year=4713;
			month=1,day=0;
			//年 
			a=n/1461;
			n%=1461;
			year-=a*4;
			if(n>366){
				year--,n-=366;
				if(n>365)year--,n-=365;
				if(n>365)year--,n-=365;
				//普通月
				for(int i=1;i<=11;i++){
					if(n>pty[i]){
						n-=pty[i];
						month++;
					}
				}
				day=n;
				//此部分收工
			}
			else{
				//闰月
				for(int i=1;i<=11;i++){
					if(n>ry[i]){
						n-=ry[i];
						month++;
					}
				}
				day=n;
			} 
		}
		else if(n<=1721423+577737){
			n-=1721424;
			tim=1;
			year=1;
			month=1,day=0;
			//年
			a=n/1461;
			n%=1461;
			year+=a*4;
			if(n>1095){
				year+=3,n-=1095;
				//闰月
				for(int i=1;i<=11;i++){
					if(n>ry[i]){
						n-=ry[i];
						month++;
					}
					else break;
				}
				day=n;
				//此部分收工
			}
			else{
				//普通月
				if(n>365)year++,n-=365;
				if(n>365)year++,n-=365;
				for(int i=1;i<=11;i++){
					if(n>pty[i]){
						n-=pty[i];
						month++;
					}
					else break;
				}
				day=n;
			}
		}
		else{
			n-=1721424;
			n+=10;
			tim=1;
			year=1;
			month=1,day=0;
			//年
			a=n/146097;
			n%=146097;
			year+=a*400;
			
			if(n>109572){
				year+=300;
				n-=109572;
				//第百润年 
				a=n/1461;
				n%=1461;
				year+=a*4;
				if(n>1095){
					year+=3,n-=1095;
					//闰月
					for(int i=1;i<=11;i++){
						if(n>ry[i]){
							n-=ry[i];
							month++;
						}
						else break;
					}
					day=n;
					//此部分收工
				}
				else{
					//普通月
					if(n>365)year++,n-=365;
					if(n>365)year++,n-=365;
					for(int i=1;i<=11;i++){
						if(n>pty[i]){
							n-=pty[i];
							month++;
						}
						else break;
					}
					day=n;
				}
			}
			else{
				//第百不闰年
				if(n>36524)year+=100,n-=36524;
				if(n>36524)year+=100,n-=36524;
				if(n>35064){
					year+=96;
					n-=35064;
					if(n>365)year++,n-=365;
					if(n>365)year++,n-=365;
					if(n>365)year++,n-=365;
					for(int i=1;i<=11;i++){
						if(n>pty[i]){
							n-=pty[i];
							month++;
						}
						else break;
					}
					day=n;
				}
				else{
					a=n/1461;
					n%=1461;
					year+=a*4;
					if(n>1095){
						year+=3,n-=1095;
						//闰月
						for(int i=1;i<=11;i++){
							if(n>ry[i]){
								n-=ry[i];
								month++;
							}
							else break;
						}
						day=n;
						//此部分收工
					}
					else{
						//普通月
						if(n>365)year++,n-=365;
						if(n>365)year++,n-=365;
						for(int i=1;i<=11;i++){
							if(n>pty[i]){
								n-=pty[i];
								month++;
							}
							else break;
						}
						day=n;
					}
				}
			}
		}
		printf("%lld %lld %lld ",day,month,year);
		if(tim==0)printf("BC");
		printf("\n");
	}
	return 0;
}
2022/9/6 13:32
加载中...