08/01/02 20:39:23
「1にちずつ遡りながら日付を表示」とかやるとbefore()の処理量が馬鹿にならないので、
>>601に載ってるのを参考に書き換えてみました
/* 西暦1年1月0日からの経過日数から、日付を求める */
Date make_date(int n)
{
int y=(n+305)/146097*400
+(n+305)%146097/36524*100
+(n+305)%146097%36524/1461*4
+(n+305)%146097%36524%1461/365;
int diff=n-(365*(y-1)+y/4-y/100+y/400+31+28); // 3月0日からの経過日数
if(diff==0){ //2月29日
diff=366;
y--;
}
int m;
for(m=3;;m++){
//3月0日からm月0日までの経過日数, 30*(m-3)+3*(m+1)/5-2 の変形
if(153*(m+1)/5-122<diff && diff<=153*(m+2)/5-122){
break;
}
}
int d=diff-(153*(m+1)/5-122);
if(m>12){
m-=12;
y++;
}
Date x={y,m,d};
return x;
}