如果你是一个普及选手且做过这道题那你可以看懂:
if(x>2305447){
x-=2305447;
int _400_year_round=x/(400*365+24*4+1),end_month;
int year=1600+_400_year_round*400;
x-=_400_year_round*400;
for(register int i=year;;++i){
int minus=check_run(i)?366:365;
if(x<=minus){
for(register int j=1;j<=12;++j){
if(check_run(i) && j==2){
if(x>29) x-=29;
else{
end_month=j;
break;
}
}
else{
if(x>julian_month[j]) x-=julian_month[j];
else{
end_month=j;
break;
}
}
}
cout<<x<<' '<<end_month<<' '<<i<<endl;
return ;
}
else x-=minus;
}
}
看不懂这是在干什么也可以在后面找到答案
楼主现在这份代码还没有调出来,这里出了bug。当然不求广大万能网友调题,因为模拟题不会有人帮调,只是他有了一个新发现想告诉大家:
将这一行
for(register int i=year;;++i)
改为
for(register int i=year;i<=year+400;++i)
将会影响前面 BC 的结果!!!
如果你想看楼主神奇的整份代码可以在这里观看
大致意思其实就是大力分讨,当r在我计算好的范围内,我会将前面的BC(公元前)优先处理。
然而现在这一段代码是计算从1600.1.1开始的往后每400年的循环,这时的r是所有情况中最大的。所以肯定是不影响之前的讨论情况的(虽然显然但问题就出在了这里)
这一段for循环的意思就是:当前剩余的日子已经无法支撑400年的循环,就开始一年年的找,所以按照代码的理解,year->year+400和year->INF 是一个意思。
但是呢,当楼主将后者改成前者之后,再查看下好的第五个样例点,居然神奇的发现有些公元前的日期产生了变化。也就是后面的修改影响了之前的结果,一个改变,另一个之前已经发生过的东西也发生了改变,这不是量子纠缠是什么!
聪明的你,能帮楼主验证这个伟大猜想吗?