6855. 【CSP2020提高组正式赛】儒略日 (julian)

Description

Input

Output

Sample Input

Sample Input1
3
10
100
1000 


Sample Input2
3
2000000
3000000
4000000 
 

Sample Output

Sample Output1
11 1 4713 BC
10 4 4713 BC
27 9 4711 BC 


Sample Output2
14 9 763
15 8 3501
12 7 6239
 

Data Constraint

 Solution

先把时间分成公元前、公元后1582.10.4前、公元后1582.10.15后,暴力算出每段的范围,分类讨论

前两种做法类似,先按照4年为周期算,剩下的零散部分暴力求

后一种先按400年为周期算,剩下的也暴力,时间复杂度O(400n)、

总结:思路很简单、很暴力,

但是细节很多。

千万不能相信它“精心”给你出的小大样例!

必须肉查一遍、对每一段都出数据验证!

要相信:

你都已经做了两个小时了,

再检查半个小时也没什么大问题。

以下几种代码,看看你需要看哪种,能看得懂哪种吧

 

Code1

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define I int
#define ll long long
#define F(i,a,b) for(I i=a;i<=b;i++)
#define Fd(i,a,b) for(I i=a;i>=b;i--)
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
ll T,r,d,m,y;
I bc,a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
I main(){
	freopen("julian.in","r",stdin);
	freopen("julian.out","w",stdout);
	scanf("%lld",&T);
	I tot=0;
	while(T--){
		if(++tot==21){
			tot++,tot--;
		}
		scanf("%lld",&r);
		bc=(r<1721424);y=4713,m=1,d=1;
		if(r<1721424){
			y-=(r/1461)*4;
			r%=1461;
			while(r>=365+(y%4==1)){
				r-=365+(y%4==1);y--;
			}
			if(!y) y=1;
			while(r){
				if(m!=2&&r>=a[m]){
					r-=a[m];m++;
				}
				else if(m==2&&r>=a[m]+(y%4==1)){
					r-=a[m]+(y%4==1);m++;
				}
				else{
					d+=r;r=0;break;
				}
			}
		}
		else{
			r-=1721424;
			if(r<=577736){
				y=m=d=1;
				y+=(r/1461)*4;
				r%=1461;
				while(r>=365+(y%4==0)){
					r-=365+(y%4==0);y++;
				}
				while(r){
					if(m!=2&&r>=a[m]){
						r-=a[m];m++;
					}
					else if(m==2&&r>=a[m]+(y%4==0)){
						r-=a[m]+(y%4==0);m++;
					}
					else{
						d+=r;r=0;break;
					}
				}
			}
			else{
				y=1582,m=10,d=15;
				r-=577737;
				if(r<78){
					if(r<=16){
						d+=r;
					}
					else{
						r-=17;
						m=11,d=1;
						while(r){
							if(m!=2&&r>=a[m]){
								r-=a[m];m++;
							}
							else if(m==2&&r>=a[m]+(((y%4==0)&&(y%100>0))||(y%400==0))){
								r-=a[m]+(((y%4==0)&&(y%100>0))||(y%400==0));m++;
							}
							else{
								d+=r;r=0;break;
							}
							if(m>12) m=1;
						}
					}
				}
				else{
					r-=78;
					y=1583,m=d=1;
					y+=(r/584388)*1600;
					r%=584388;
					while(r>=365+((((y)%4==0)&&((y)%100>0))||((y)%400==0))){
						r-=365+((((y)%4==0)&&((y)%100>0))||((y)%400==0));
						y++;
					}
					while(r){
						if(m!=2&&r>=a[m]){
							r-=a[m];m++;
						}
						else if(m==2&&r>=a[m]+(((y%4==0)&&(y%100>0))||(y%400==0))){
							r-=a[m]+(((y%4==0)&&(y%100>0))||(y%400==0));m++;
						}
						else{
							d+=r;r=0;break;
						}
					}
				}
			}
		}
		if(!bc) printf("%lld %lld %lld\n",d,m,y);
		else printf("%lld %lld %lld BC\n",d,m,y);
	}
	return 0;
}

Code2

#include<cstdio>
using namespace std;
typedef long long ll;
const int _400y=146097,_4y=1461,mid=2299160,BC=1721424;
const int day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int D[146105],M[146105],Y[146105];
int main()
{
	freopen("julian.in","r",stdin);
	freopen("julian.out","w",stdout);
	int q;ll n,d,m,y;bool flag=1;
	scanf("%d",&q);
	for(int cnt=0,da=1,mo=1,ye=0;cnt<=_400y;++cnt,++da)
	{
		if(da>da
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值