« Magi-Cu!! | Main | は~とデーターベース計画 »

2004.02.29

魔法使いのカレンダー


今日はうるう年の2月29日。
ってことで、魔法使いのカレンダーを紹介しちゃいます。

じつは、あるプログラムのなかに出てくる式なんですが・・・
この式は簡単な足し算引き算割り算で出来てるにもかかわらず、1月が31日まであり、2月は28日までだが4年に1度29日まであるってことを知ってるんですよ。
かなり不思議です。 だから、『魔法使いのカレンダー』。

たとえば、「今日の数字=2453065」を魔法使いのカレンダーに足したり引いたり割ったりして計算してもらうと「2004年2月29日」という答えが出てきます。
ちなみに「今日の数字」とは1日ごとに1ずつ増えていく単なる数字です。


「今日の数字=2453065」に1足した数字を魔法使いのカレンダーに計算してもらうと「2004年3月1日」と計算されます。
しかし計算式のどこにも29なんて数字が出てこないにもかかわらず、29日の次はちゃんと1日になるんです。 いったいどの部分が29の次を1にさせてるのでしょう??
もちろん2003年2月28日の次は3月1日でした。

きっとこれは、どこかの魔法使いさんがこの数式に魔法をかけたに違いありません。
「今日の数字=2453065」ってことは今日の数字をかぞえ始めたのはピラミッドができるよりも2000年以上も前のことです。
何だか神秘的ですらあります。


これが、そのプログラムです。
zに今日の数字を入れると最後に年月日がyyyy,mm,ddに順番に出てきます。
void CMyTime::GetYMD( long &yyyy, long &mm, long &dd) const
{
long a, b, c, d, e, f, k, m, y, z;

z = GetJDay( );
f = 0;

if ( 2299161L <= z ) {
a = ( z * 100 - 186721625L ) / 3652425L;
a = z + 1 + a - ( a / 4 );
}
else {
a = z;
}
b = a + 1524;
c = ( b * 100 - 12210 ) / 36525;
k = ( 36525 * c ) / 100;
e = ( b - k ) * 10000 / 306001;
d = b - k - ( 306001 * e / 10000 ) + f;

if ( e <= 13 ) m = e - 1 ;
else m = e - 13;
if ( 3 <= m ) y = c - 4716;
else y = c - 4715;

yyyy = y;
mm = m;
dd = d;
}
♥ユリウス歴とか書いてあったから、魔法使いのユリウスさんあたりが作ったのでしょう??

ちなみに人間界での計算式では
not in service@cocolog 2月29日とプログラミング
にあるような方法をとります。
not in service@cocologのbrigadierさん、勝手に人間代表にとりあげさせてしまってすみません。


« Magi-Cu!! | Main | は~とデーターベース計画 »

Comments

人間代表に選ばれて光栄です。
改めて暦について調べると、知らなかったことばかりです。

Posted by: brigadier | 2004.02.29 at 02:36 PM

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/4052/245690

Listed below are links to weblogs that reference 魔法使いのカレンダー:

« Magi-Cu!! | Main | は~とデーターベース計画 »