社区讨论

【无事氵】相对较空的小伙伴来评价一下码风

灌水区参与者 10已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@locyl3p7
此快照首次捕获于
2023/10/30 21:51
2 年前
此快照最后确认于
2023/11/05 08:13
2 年前
查看原帖
题目是今年CSP的儒略日
CPP
#include<bits/stdc++.h>
#define int long long 
#define reg register
#define Open(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout);
using namespace std;
int read(){
	int x=0,f=0;
	char ch=0;
	while(!isdigit(ch))f|=(ch=='-'),ch=getchar();
	while(isdigit(ch))(x*=10)+=(ch^48),ch=getchar();
	return f?-x:x;
}
int Day;
const int 
	_DaysForMonth[]={-1,31,-1,31,30,31,30,31,31,30,31,30,31},
	_DaysEveryFourYear=1461,
	_FirstYearBCE=4713,
	_FirstYearCE=1,
	_FirstYearGregorian=1582,
	_FirstMonth=1,
	_FirstDay=1,
	_DaysLeapYear=366,
	_DaysCommonYear=365,
	_MonthsEveryYear=12,
	_DaysBeforeCE=1721423,
	_DaysBeforeGregorian=2299160,
	_DaysForFebInLeapYear=29,
	_DaysForFebInCommonYear=28,
	_DaysEveryFourHundredsYear=146097;
	
namespace BCE{
	bool isLeapYear(const int _Year){
		return (_Year-1)%4==0;
	}
	void Main(const int _Day){
		
		int Days_Untreated=_Day;
		int Year_Now=_FirstYearBCE,Month_Now=_FirstMonth,Day_Now=_FirstDay;
	
		Year_Now-=Days_Untreated/_DaysEveryFourYear*4;
		Days_Untreated%=_DaysEveryFourYear;
		
		int Days_To_Year=_DaysLeapYear;
		
		while(Days_Untreated>Days_To_Year){
			
			Days_Untreated-=Days_To_Year;
			Year_Now--;
			
			if(isLeapYear(Year_Now)){
				Days_To_Year=_DaysLeapYear;
			}
			else{
				Days_To_Year=_DaysCommonYear;
			}
				
		}
		
		int Days_To_Month=_DaysForMonth[Month_Now];
		
		while(Days_Untreated>=Days_To_Month){
			
			Days_Untreated-=Days_To_Month;
			Month_Now++;
			
			if(Month_Now>_MonthsEveryYear){
			
				Month_Now=_FirstDay;
				Year_Now--;
				
				if(isLeapYear(Year_Now)){
					Days_To_Year=_DaysLeapYear;
				}
				else{
					Days_To_Year=_DaysCommonYear;
				}
				
			}
			
			if(Month_Now==2){
				if(isLeapYear(Year_Now)){
					Days_To_Month=_DaysForFebInLeapYear;
				}
				else {
					Days_To_Month=_DaysForFebInCommonYear;
				}
			}
			else{
				Days_To_Month=_DaysForMonth[Month_Now];
			}
			
		}
		
		Day_Now+=Days_Untreated;
		
		printf("%lld %lld %lld BC\n",Day_Now,Month_Now,Year_Now);
	}
}
namespace CEBeforeGregorian{
	bool isLeapYear(const int _Year){
		return _Year%4==0;
	}
	void Main(const int _Day){
		
		int Days_Untreated=_Day-_DaysBeforeCE-1;
		int Year_Now=_FirstYearCE,Month_Now=_FirstMonth,Day_Now=_FirstDay;
		
		Year_Now+=Days_Untreated/_DaysEveryFourYear*4;
		Days_Untreated%=_DaysEveryFourYear;
		
		int Days_To_Year=_DaysCommonYear;
		
		while(Days_Untreated>Days_To_Year){
			
			Days_Untreated-=Days_To_Year;
			Year_Now++;
			
			if(isLeapYear(Year_Now)){
				Days_To_Year=_DaysLeapYear;
			}
			else{
				Days_To_Year=_DaysCommonYear;
			}
			
		}
		
		int Days_To_Month=_DaysForMonth[1];
		
		while(Days_Untreated>=Days_To_Month){
			
			Days_Untreated-=Days_To_Month;
			Month_Now++;
			
			if(Month_Now>_MonthsEveryYear){
				
				Month_Now=_FirstMonth;
				Year_Now++;
				
				if(isLeapYear(Year_Now)){
					Days_To_Year=_DaysLeapYear;
				}
				else{
					Days_To_Year=_DaysCommonYear;
				}
				
			}
			
			if(Month_Now==2){
				if(isLeapYear(Year_Now)){
					Days_To_Month=_DaysForFebInLeapYear;
				}
				else {
					Days_To_Month=_DaysForFebInCommonYear;
				}
			}
			else{
				Days_To_Month=_DaysForMonth[Month_Now];
			}
			
		}
		
		Day_Now=Day_Now+Days_Untreated;
		
		printf("%lld %lld %lld\n",Day_Now,Month_Now,Year_Now);
	}
}
namespace CEAfterGregorian{
	bool isLeapYear(const int _Year){
		return (_Year%4==0&&_Year%100!=0)||(_Year%400==0);
	}
	void Main(const int _Day){
		
		const int _DaysCompensated=287;
		int Days_Untreated=_Day-_DaysBeforeGregorian-1+_DaysCompensated;
		//Return 287 days so we can solve the problem in 1582.1.1
		//Because we know the date must be later than 1582.10.15
		//Although the 1582.10.5-1582.10.14 is nonexistent
		//But we can compensate the date 287 days to make our problem easier
		
		int Year_Now=_FirstYearGregorian,Month_Now=_FirstMonth,Day_Now=_FirstDay;
		
		Year_Now+=Days_Untreated/_DaysEveryFourHundredsYear*400;
		Days_Untreated=Days_Untreated%_DaysEveryFourHundredsYear;
				
		int Days_To_Year=_DaysCommonYear;
		
		while(Days_Untreated>Days_To_Year){
			
			Days_Untreated-=Days_To_Year;
			Year_Now++;
			
			if(isLeapYear(Year_Now)){
					Days_To_Year=_DaysLeapYear;
			}
			else{
				Days_To_Year=_DaysCommonYear;
			}
			
		}
		
		int Days_To_Month=_DaysForMonth[Month_Now];
		
		while(Days_Untreated>=Days_To_Month){
			
			Days_Untreated-=Days_To_Month;
			Month_Now++;
			
			if(Month_Now>_MonthsEveryYear){
				
				Month_Now=_FirstMonth;
				Year_Now++;
				
				if(isLeapYear(Year_Now)){
					Days_To_Year=_DaysLeapYear;
				}
				else{
					Days_To_Year=_DaysCommonYear;
				}
				
			}
			
			if(Month_Now==2){
				if(isLeapYear(Year_Now)){
					Days_To_Month=_DaysForFebInLeapYear;
				}
				else {
					Days_To_Month=_DaysForFebInCommonYear;
				}
			}
			else{
				Days_To_Month=_DaysForMonth[Month_Now];
			}
			
		}
		
		Day_Now=Day_Now+Days_Untreated;
		
		printf("%lld %lld %lld\n",Day_Now,Month_Now,Year_Now);
	}
}
signed main(){
	for(reg int T=read();T;T--){
		Day=read();
		if(Day<=_DaysBeforeCE) {
			BCE::Main(Day);
		}
		else{
			if(Day<=_DaysBeforeGregorian) {
				CEBeforeGregorian::Main(Day);
			}
			else {
				CEAfterGregorian::Main(Day);
			}
		}
	}
	return 0;
}

回复

10 条回复,欢迎继续交流。

正在加载回复...