求调儒略日!!!老是就差一天??求助大佬
  • 板块学术版
  • 楼主Karis
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/10/3 11:31
  • 上次更新2023/11/4 05:03:33
查看原帖
求调儒略日!!!老是就差一天??求助大佬
478755
Karis楼主2021/10/3 11:31
#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
#define R register

using namespace std;
const int months[15]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monthr[15]={31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
ll Month();
ll Monthr();


ll read()
{
	R ll x = 0, f = 1;
	R char ch = getchar();
	while(ch > '9' || ch < '0')
	{
		if(ch == '-')
			f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9')
	{
		x = x*10 + ch-'0';
		ch = getchar();
	}
	return x*f;
}

int tmp[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

void calc1(ll r)
{
	ll year = r/1461*4;
	r %= 1461;
	bool flag = true;//代表在不在闰年里,因为在公元前以四年为一个周期时第一年时闰年(因为公元前4713年是闰年) 
	if(r >= 366)//如果等于366就是闰年的最后一天,在后面特判 
		r -= 366, year++, flag = false;
	if(flag == false)
		year += (r/365), r %= 365;
	if(r == 0)
	{
		printf("%lld %lld %lld BC\n", 31, 12, 4713-year+1);//特判 
		return;
	}
	for(R int i = 1; i <= 12; ++i)
	{
		if(i == 2 && flag == true)
		{
			if(r > 29)
			{
				r -= 29;
				continue;
			}
			else
			{
				printf("%lld %lld %lld BC\n", r, i, 4713-year);
				break;
			}
		}
		if(r > tmp[i])
			r -= tmp[i];
		else
		{
			printf("%lld %lld %lld BC\n", r, i, 4713-year);
			break;
		}
	}
	return;
}

void calc2(ll r)
{
	if(r <= 577737)//1582年10月5日之前(和calc1一样的计算方法) 
	{
		ll year = r/1461*4+1;
		r %= 1461;
		bool flag = false;
		if(r >= 1095)
			r -= 1095, year += 3, flag = true;
		if(flag == false) 
			year += (r/365), r %= 365;
		if(r == 0)
		{
			printf("%lld %lld %lld\n", 31, 12, year-1);//特判 
			return;
		}
		for(R int i = 1; i <= 12; ++i)
		{
			if(i == 2 && flag == true)
			{
				if(r > 29)
				{
					r -= 29;
					continue;
				}
				else
				{
					printf("%lld %lld %lld\n", r, i, year+1);
					break;
				}
			}
			if(r > tmp[i])
				r -= tmp[i];
			else
			{
				printf("%lld %lld %lld\n", r, i, year+1);
				break;
			}
		}
	}
	else//在1582年10月5日之后 
	{
		r += 10-12;
		ll year = r/146097*400;//有几个四百年格里高利历
		r %= 146097;
		year += r/36524*100;//有几个100年
		r %= 36524;
		year += r/1461*4;
		r %= 1461;
		bool flag = false;
		if(r >= 1095)
			flag = true;
		year += r/365,r %= 365;
		if(r == 0)
		{
			printf("%lld %lld %lld\n", 31, 12, year-1);//特判 
			return;
		}
		for(R int i = 1; i <= 12; ++i)
		{
			if(i == 2 && flag == true)
			{
				if(r > 29)
				{
					r -= 29;
					continue;
				}
				else
				{
					printf("%lld %lld %lld\n", r, i, year+1);
					break;
				}
			}
			if(r > tmp[i])
				r -= tmp[i];
			else
			{
				printf("%lld %lld %lld\n", r, i, year+1);
				break;
			}
		}
}

int main()
{
	//freopen("julian.in","r",stdin);freopen("julian.out","w",stdout);
	ll Q = read();
	while(Q--)
	{
		ll r = read();
		rr=r;
		++r;
		if(r <= 1721424)//公元前
			calc1(r);
		else	
			calc2(r-1721424); 
	}
	//fclose(stdin);fclose(stdout);
	return 0;
}

/*

2339484

9 3 1693
-------------------
572844041

11 8 1563681
------------------------
2358488

21 3 1745
-------------------
2351158

24 2 1725
*/
2021/10/3 11:31
加载中...