CSP2020儒略日调试

题目链接:https://www.luogu.com.cn/problem/P7075
调了挺久了。小一点的数字能对的,大样例对错都有,错的一般是多了一天。给代码注释了一下。

错误样例

1

543525290

正确答案为

7 8 1483409

我的答案:

8 8 1483409

前两个样例是能过的。所以我怀疑我的代码前一部分出了问题。即1582 年 10 月 4日以后有问题。

代码丑陋。

#include
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<//以此为时间点 ,一共有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<else 
            cout<<newd<<" "<<newm<<" "<<-newy<<" "<<"BC"<