题解
2023-10-31 15:52:15
发布于:江苏
14阅读
0回复
0点赞
注意看,拿出我新买的水果手机,打开日历,翻到1582年,奇怪?为什么10月少了10天?糟糕,手机黑屏了,打不开了!NO!我花3.5个亿买的新苹果!!!
#include <iostream>
#define int long long
#define ull unsigned long long
using namespace std;
int T;
ull d,m;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//每月天数列表
ull year_to_day(int year){
int start = -4712;//公元元年不存在
if (year < start) return 0;
ull res = (year - start + 1) * 365;
if (year < 1582) {
res += (year - start) / 4 + 1;//儒略历
} else {
res -= 10;
res += (1581 - start)/4 + 1; //1582年以前用儒略历
res += (year-1580)/4 - (year-1500)/100 +(year-1200)/400; // 1582年后用格里高利历,容斥原理求闰年数
}
return res;
}
bool pd(int x){//判断是否是闰年
if (x>=1582)return(x%4==0&&x%100!=0)||(x%400==0);
else return x % 4 == 0;
}
signed main(){
cin >> T;
while(T--){
cin >> d;
d++;
int l=-4712,r=1e9+5,mid;
while(l<r){//二分答案
mid=(l+r)>>1;
if(year_to_day(mid)>=d)r=mid;
else l=mid+1;
}
d-=year_to_day(l-1);//减去去年
a[2]=28+pd(l);
a[10] = l==1582 ? 21 : 31;//特判
for(int i=1;i<=12;i++){//确定月份和日期
if(d>a[i])d-=a[i];
else{
m=i;
break;
}
}
if(l==1582&&m==10&&d>=5)d+=10;//1582年10月没有5-14日,10.4明天就是10.15
if(l>0)cout << d << " " << m << " " << l << endl;
else cout << d << " " << m << " " << 1-l << " BC" << endl;//加的一年要减回去
}
return 0;
}
这里空空如也
有帮助,赞一个