萌新先做的前3个点的调试,第二个点为啥过不去呢,有注释
查看原帖
萌新先做的前3个点的调试,第二个点为啥过不去呢,有注释
90428
胖达和阿极楼主2021/10/10 23:33
#include<bits/stdc++.h>
using namespace std;
int m,d,y,q;
const int fy =4713;
const int fm =1;
const int fd =1;
int bc(int number){
//	int num=0;
	//1 5 9 + ... (n-1)*4+1;
	//a(n)=(n-1)*4+1;
	//4713-1 =1178组 --- -4713年是闰年
	//-4713(r) -4712 -4711 -4710 -4709(r) 
	//366+365+365+365 or 直接跑一个for循环 
//	for(int i=-4713;i<=-1;i++){
//		if(abs(i+1)%4==0){
//			num+=366;
//		} else{
//			num+=365;
//		}
//	}
	//跑出一个num为 1721424
	 
	 
	 
	 //---
	 //处理bc函数
	 //365*3+366=1461;
	 int y_zu=abs(number/1461);
	 int low_number=number-y_zu*1461;
	 //确定四组的日期
	  int fist_year=-4713+y_zu*4;
	  //直接for循环带走
	  int run=1;
	  for(int i=1;i<=4;i++){
	  	//i%4==1 判断是否为闰年  
	  	int panyear=(i%4==1)+i*365;int last_panyear=0;
	  	if(i!=1){
	  		 last_panyear =366+(i-2)*365;
		  }
	  	if(i==2){
	  		run=0;
		  }
	  	if(low_number<=panyear){
	  		y=fist_year+i-1;
	  		low_number-=last_panyear;
	   		break;
		  }
	  }
	  //确定month
	  int num1=0;
	  int last_month_day=0;
	  for(int i=1;i<=12;i++){
	  	last_month_day=num1;
	  	if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){
	  		num1+=31;
	  		
		  }else if(i==4||i==6||i==9||i==11){
		  	num1+=30;
		  }else{
		  	if(run){
		  		num1+=29;
			  }else{
			  	num1+=28;
			  }
		  }
		  if(low_number<=num1){
		  	m=i;
		  	low_number-=last_month_day;
		  	d=low_number;
		  	break;
		  }
	}
}
void cha(int number){
	//处理公元以前的天数
	//原理 
	//int number1=bc(number); 
	//当number<=1721424 属于公元前直接处理bc函数ok
	if(number<=1721424){
		bc(number);return; 
	}
	
//	 if(number1){
//	 	//处理公元后 
//	 	number1=acb(number);
//	 	if(number1){
//	 		//处理1582 - 10 - 15日以后 
//	 		aca(number+1);
//		 }else{
//		 	return;
//		 }
//	 }else{
//	 	return;
//	 }
}
int main(){
int Q;
cin>>Q;
for(int Q1=1;Q1<=Q;Q1++){
	scanf("%d",&q);
	cha(q+1);
	if(y<0){
		printf("%d %d %d BC\n",d,m,-y);
	}else{
		printf("%d %d %d",d,m,y);
	}
}
return 0;
}

2021/10/10 23:33
加载中...