题目链接:https://www.luogu.com.cn/problem/P7075
调了挺久了。小一点的数字能对的,大样例对错都有,错的一般是多了一天。给代码注释了一下。
错误样例
1
543525290
正确答案为
7 8 1483409
我的答案:
8 8 1483409
前两个样例是能过的。所以我怀疑我的代码前一部分出了问题。即1582 年 10 月 4日以后有问题。
代码丑陋。
#include<bits/stdc++.h>
using namespace std;
#define rt register int
int T,newy,newm,newd;
long long n;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int month2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){
// freopen("julian3.in","r",stdin);
// freopen("julian3.out","w",stdout);
ios::sync_with_stdio(false);
cin>>T;
while(T--)
{
cin>>n;
if(n==2299160)cout<<4<<" "<<10<<" "<<1582<<endl;//以此为时间点 ,一共有2299160天
else if(n>2299160){
newy=1582,newm=10,newd=1;n+=13;//补上不存在的天数
n-=2299160;//扣掉初始化用掉的天数
while(1){//到第几年
if((newy%4==0&&newy%100!=0)||newy%400==0){//闰年判断
if(n>=366){
++newy;n-=366;
}else break;//如果不够减就退出年的计算
}else{
if(n>=365){
++newy;n-=365;
}else break;
}
}
while(1){//这里是决定到第几月份
if((newy%4==0&&newy%100!=0)||newy%400==0)
{
if(n>=month2[newm]){//month2对应闰年
n-=month2[newm];++newm;
if(newm>12){++newy;newm=1;}//防止月份溢出
}else break;//进入日的计算
}else{
if(n>=month[newm]){
n-=month[newm];++newm;
if(newm>12){++newy;newm=1;}
}else break;
}
}
if((newy%4==0&&newy%100!=0)||newy%400==0){//计算天数
newd+=n;
if(newd>month2[newm]){
newd-=month2[newm];
++newm;
if(newm>12){++newy;newm=1;}//防溢出
}
}else{
newd+=n;
if(newd>month[newm]){
newd-=month[newm];
++newm;
if(newm>12){++newy;newm=1;}
}
}
}else{
newy=-4713,newm=1,newd=1;
while(1){
if((newy<0&&(-newy-1)%4==0)||newy>0&&newy%4==0){
if(n>=366){
++newy;n-=366;
if(newy==0)++newy;
}else break;
}else{
if(n>=365){
++newy;n-=365;
if(newy==0)++newy;
}else break;
}
}
while(1){
if((newy<0&&(-newy-1)%4==0)||newy>0&&newy%4==0)
{
if(n>=month2[newm]){
n-=month2[newm];++newm;
if(newm>12){++newy;newm=1;if(newy==0)++newy;}
}else break;
}else{
if(n>=month[newm]){
n-=month[newm];++newm;
if(newm>12){++newy;newm=1;if(newy==0)++newy;}
}else break;
}
}
if((newy<0&&(-newy-1)%4==0)||newy>0&&newy%4==0){
newd+=n;
if(newd>month2[newm]){
newd-=month2[newm];
++newm;
if(newm>12){++newy;newm=1;if(newy==0)++newy;}
}
}else{
newd+=n;
if(newd>month[newm]){
newd-=month[newm];
++newm;
if(newm>12){++newy;newm=1;if(newy==0)++newy;}
}
}
}
if(newy>0)
cout<<newd<<" "<<newm<<" "<<newy<<endl;
else
cout<<newd<<" "<<newm<<" "<<-newy<<" "<<"BC"<<endl;
}
}