求助各位
查看原帖
求助各位
335191
式呀式呀式呀楼主2020/11/8 09:25

考试的时候T1写了2.5h,最后没调出来放弃的时候真的快哭了

以下考试代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <algorithm>
typedef long long ll;
const int maxn=100000+10,d_4=1461,d_400=146097;
ll read(){
	ll w=0,x=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') x=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		w=(w<<1)+(w<<3)+(ch^48);
		ch=getchar();
	}
	return w*x;
}
int q;
ll x;
ll Day,Month,Year;
void Solve1(){//公元前,julian历
	ll xx=x/d_4;
	Year=4713-xx*4;
	x=x%d_4;
	Day=1;
	Month=1;
	if(x>366){
		x-=366;
		Year--;
	}
	if(x>365){
		x-=365;
		Year--;
	}
	if(x>365){
		x-=365;
		Year--;
	}
	if(x<31){//1
		Day+=x;
		printf("%lld %lld %lld BC\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if((Year-1)%4==0){//2
		if(x<29){
			Day+=x;
			printf("%lld %lld %lld BC\n",Day,Month,Year);
			return;
		}
		x-=29;
	}else {
		if(x<28){
			Day+=x;
			printf("%lld %lld %lld BC\n",Day,Month,Year);
			return;
		}
		x-=28;
	}
	Month++;
	
	if(x<31){//3
		Day+=x;
		printf("%lld %lld %lld BC\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;

	if(x<30){//4
		Day+=x;
		printf("%lld %lld %lld BC\n",Day,Month,Year);
		return;
	}
	x-=30;
	Month++;
	
	if(x<31){//5
		Day+=x;
		printf("%lld %lld %lld BC\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(x<30){//6
		Day+=x;
		printf("%lld %lld %lld BC\n",Day,Month,Year);
		return;
	}
	x-=30;
	Month++;
	
	if(x<31){//7
		Day+=x;
		printf("%lld %lld %lld BC\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(x<31){//8
		Day+=x;
		printf("%lld %lld %lld BC\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(x<30){//9
		Day+=x;
		printf("%lld %lld %lld BC\n",Day,Month,Year);
		return;
	}
	x-=30;
	Month++;
	
	if(x<31){//10
		Day+=x;
		printf("%lld %lld %lld BC\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(x<30){//11
		Day+=x;
		printf("%lld %lld %lld BC\n",Day,Month,Year);
		return;
	}
	x-=30;
	Month++;
	
	if(x<31){//12
		Day+=x;
		printf("%lld %lld %lld BC\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
}
void Solve2(){//公元,julian历
	ll xx=x/d_4;
	Year=xx*4+1;
	x=x%d_4;
	Day=1;
	Month=1;
	if(x>365){
		x-=365;
		Year++;
	}
	if(x>365){
		x-=365;
		Year++;
	}
	if(x>365){
		x-=365;
		Year++;
	}
	if(x<31){//1
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(Year%4==0){//2
		if(x<29){
			Day+=x;
			printf("%lld %lld %lld\n",Day,Month,Year);
			return;
		}
		x-=29;
	}else {
		if(x<28){
			Day+=x;
			printf("%lld %lld %lld\n",Day,Month,Year);
			return;
		}
		x-=28;
	}
	Month++;
	
	if(x<31){//3
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;

	if(x<30){//4
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=30;
	Month++;
	
	if(x<31){//5
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(x<30){//6
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=30;
	Month++;
	
	if(x<31){//7
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(x<31){//8
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(x<30){//9
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=30;
	Month++;
	
	if(x<31){//10
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(x<30){//11
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=30;
	Month++;
	
	if(x<31){//12
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
}
bool is_r(ll x){
	if(x%400==0) return true;
	if(x%4==0&&x%100!=0) return true;
	return false;
}
void Solve3(){//公元,格里高利历
	if(x<77){
		Year=1582;
		Month=10;
		Day=15;
		if(x<17){//10
			Day+=x;
			printf("%lld %lld %lld\n",Day,Month,Year);
			return;
		}
		x-=17;
		Month++;
		Day=1;
		if(x<=30){//11
			Day+=x;
			printf("%lld %lld %lld\n",Day,Month,Year);
			return;
		}
		x-=30;
		Month++;
		if(x<31){//12
			Day+=x;
			printf("%lld %lld %lld\n",Day,Month,Year);
			return;
		}
	}
	x-=77;
	Year=1583;
	Month=1;
	Day=1;
	ll xx=x/d_400;
	Year+=xx*400;
	x%=d_400;
	xx=x/d_4;
	Year+=xx*4;
	x%=d_4;
	//printf("x==%lld\n",x);
	while(x>=365){
		if(is_r(Year)){
			if(x<366) break;
			Year++;
			x-=366;
		}
		else {
			Year++;
			x-=365;
		}
	}
	if(x<31){//1
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(is_r(Year)){//2
		if(x<29){
			Day+=x;
			printf("%lld %lld %lld\n",Day,Month,Year);
			return;
		}
		x-=29;
	}else {
		if(x<28){
			Day+=x;
			printf("%lld %lld %lld\n",Day,Month,Year);
			return;
		}
		x-=28;
	}
	Month++;
	
	if(x<31){//3
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;

	if(x<30){//4
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=30;
	Month++;
	
	if(x<31){//5
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(x<30){//6
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=30;
	Month++;
	
	if(x<31){//7
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(x<31){//8
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(x<30){//9
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=30;
	Month++;
	
	if(x<31){//10
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
	
	if(x<30){//11
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=30;
	Month++;
	
	if(x<31){//12
		Day+=x;
		printf("%lld %lld %lld\n",Day,Month,Year);
		return;
	}
	x-=31;
	Month++;
}
void Solve(){
	q=read();
	while(q--){
		Day=0;
		Month=0;
		Year=0;
		x=read();
		if(x<1721424){
			Solve1();
			continue;
		}
		x-=1721424;
		if(x<577736){
			Solve2();
			continue;
		}
		else {
			x-=577736;
			Solve3();
		}
	}
}
int main(){
	freopen("julian.in","r",stdin);
	freopen("julian.out","w",stdout);
	Solve();
	return 0;
}
2020/11/8 09:25
加载中...