社区讨论

蒟蒻求修儒略历,不知道错哪了(知道一定会超时,但不知道为什么WA)

灌水区参与者 2已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lo27iue8
此快照首次捕获于
2023/10/23 09:16
2 年前
此快照最后确认于
2023/11/03 09:31
2 年前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
ll ti,ans;
int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool f1=false,f2=false;
ll day,month,year;
bool judge(int m,bool f)
{
	if(m<0)  m++;
    if(!f && m%4==0){return true;}
	else {
		if(m%4==0 && m%100!=0){  return true;	}
		if(m%400==0)    {return true;}
	}	
	return false;
}
void print()
{
    cout<<day<<" "<<month<<" "<<fabs(year);
    if(year<0)    cout<<" "<<"BC";
    cout<<endl;
}
void calc1(){
    int k=0;
    day=1,month=1,year=-4713;
    while(1)
    {
		k=ti;
		f1=false;
	    ti-=365;
	    year++;
	    if(ti<0)  break;
	    if(year==0)    year++;
	    f1=judge(year,false);
	    if(f1)    ti--;		
	}
	year--;
	f1=judge(year,false);
	int p=0;
	if(f1)    a[2]=29;
	for(int i=1; i<=12; i++){
		p=k;
		month++;
		if(k==a[i]) break;
		k-=a[i];
		if(k<0)    break;
	}
	a[2]=28;
	month--;
	day+=p-1;
	if(year==-4713)   day++;
	print();
	return ;
}
void calc2(){
	int day=15,month=10,year=1582;
	if(ti<17) 
	{
		day+=ti;
		cout<<day<<" "<<month<<" "<<year<<endl;
		return ;
	}
	ti-=17;
	month++;
	if(ti<a[11])
	{
		day+=ti;
		cout<<day<<" "<<month<<" "<<year<<endl;
		return ;
	}
	month++;
	ti-=a[11];
	if(ti<a[12])
	{
	    day+=ti;
	    cout<<day<<" "<<month<<" "<<year<<endl;
	    return ;	
	}
	ti-=a[12];
	month=1;
	day=1;
	year++;
	int k=0;
    while(1)
    {
		k=ti;
		f2=false;
	    ti-=365;
	    year++;
	    if(ti<0)  break;
	    f2=judge(year,true);
	    if(f2)    ti--;		
	}
	year--;
	f2=judge(year,false);
	int p=0;
	if(f2)    a[2]=28;
	for(int i=1; i<=12; i++){
		p=k;
		month++;
		if(k==a[i]) break;
		k-=a[i];
		if(k<0)    break;
	}
	a[2]=29;
	month--;
	day+=p;
	if(year==1582) day--;
	cout<<day-1<<" "<<month<<" "<<year<<endl;
}
int main()
{
	//freopen("julian.in","r",stdin);
	//freopen("juliam.out","w",stdout);
    int T=1000000000;
    //cin>>T; 
    while(T--){
		ti=T;
		if(ti<=2299160){
		    calc1();	
		}
		else {
			ti-=2299160;
			calc2();
		}
	}
	return 0;
}

回复

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

正在加载回复...