閏年は4年に1度?閏年の判定は初心者プログラミング演習の定番でしたね。

一昨日は2月29日だったので、2020年は閏年だったんですね。

閏年は4年に一度やってきますが、実際は、単純に4年に一度ではないって知っている人はどれくらいいるんでしょうか。

プログラミングを練習した事がある人なら、練習の課題でよくあるので知っている人は多いと思います。

新入社員研修でプログラミング実習なんてのがありまして、自分が新入社員の時は研修で教わったし、2年目以降は何度も研修で教えた記憶があります。

たぶん、「Hello World!」を画面に表示してみましょう。なんて初めてプログラミングに触れた時の課題と同じくらいよくやるんじゃないでしょうかね。

定番です。

…最近のことは分かりませんが昔は定番でした(^^)

あらためてWikipediaさんで閏年について調べてみると、

閏年
閏年(うるうどし、じゅんねん、英語: leap year、intercalary year)とは、閏のある年である。これに対し、閏年ではない年を平年(英語: common year)と呼ぶ。

閏年は、太陽暦では季節(天動説では太陽の運行)と暦のずれとを、太陰暦では月の運行とのずれを補正するために、平年より暦日が一つ多く、太陰太陽暦では、月の運行を基準にしていることで生じる季節(太陽の運行)とのずれを補正するために、平年より暦月が一つ多い。その追加された日や月を閏日・閏月、総称して閏と呼ぶ[1]。閏の挿入規則を置閏法(ちじゅんほう)と呼ぶ。なお、「閏」の字が常用漢字表に含まれていないため、うるう年やうるう月、うるう日と書かれる場合もある。

Wikipedia 閏年

ユリウス暦
平均太陽年を365.25日とする太陽暦の一種であり、1年を365日とする年と4年に一度366日とする年を設けた。

Wikipedia ユリウス暦

グレゴリオ暦
ユリウス暦では春分日がずれる問題を解決するため、ローマ教皇グレゴリウス13世は、当時を代表する学者たちを招集して委員会を作り、暦の研究を行わせた。こうして、1582年にグレゴリオ暦が制定された。グレゴリオ暦はその後数百年かけて各国で採用され、現在に至っている。
グレゴリオ暦では、次の規則に従って400年間に97回の閏年を設ける。
1. 西暦年が4で割り切れる年は(原則として)閏年。
2. ただし、西暦年が100で割り切れる年は(原則として)平年。
3. ただし、西暦年が400で割り切れる年は必ず閏年。

Wikipedia 閏年 グレゴリオ暦

引用しまくりました。

単純に「4年に一度」というのは、ユリウス暦から来てるのでしょう。

ユリウス暦より精度を高めたのがグレゴリオ暦ってことで勝手に理解しましたが、これでいいのかな?

とにかく、閏年というのは現在はグレゴリオ暦を使って計算することになっていると、そういうことです。

では、プログラミングするにはどうするかですが、Wikipediaにも例として単純に4年に1度(4で割り切れる)で判定してバグになることもしっかり書かれてました。

コンピュータシステムにおいて閏年を判定するアルゴリズムの記述には誤りがある場合が多く、しばしばこれが原因でシステムは重大な障害を起こす。例えば、「4で割り切れる年」としかしていなかったり、year == 2000 || year == 2004のようにある程度先の閏年しかコードしていないなどが挙げられる。

Wikipedia コンピュータシステムと閏年

ってことで、グレゴリオ暦を使って閏年を判定する時は、この3つの条件が必要です。

逐次的な3条件
まず、プログラムで処理しやすくするために閏年の規則を、次の3条件に読み替える。
1. 400で割り切れる場合は閏年
2. 400で割り切れず、100で割り切れる場合は平年
3. 条件 1. と 2. を両方とも満たさない(400で割り切れず、かつ100でも割り切れない)場合、4で割り切れれば閏年、そうでなければ平年

一つの論理式
また、閏年の規則は次の一つだけの論理式に読み替えることもできる。
(400で割り切れる)または(100で割り切れずかつ4で割り切ることができる)ならば閏年、そうでなければ平年

year % 4 == 0 && year % 100 != 0 || year % 400 == 0(C言語など)

Wikipedia コンピュータシステムと閏年

上のC言語で書かれたコードは、西暦を4で割った余りが0(→4で割り切れる)で西暦を100で割った余りが0ではない(→100で割り切れない)、または、西暦を400で割った余りが0(→400で割り切れる)ってことを表してます。

そういうことです。

これだと1行で判定できてしまいますが、条件分岐の練習も兼ねてif文を使ったコードも書いてもらったような(だいぶ曖昧な)記憶があります。

以上、引用が多すぎて読みづらくなりましたが、閏年と聞くとプログラミングのことを思い出してしまいましたので、少々書いてみました。

プログラミング的なお話が出てきて小難しい記事になってしまいましたが、「閏年は4年に1度ではない」ということをお知らせして終わります!

計算によると76年後の2096年までは4年に一度閏年が来て、その4年後の2100年は閏年では無いようです!

が、そのとき自分はもうこの世にはいないので確認できません!(^^)

タイトルとURLをコピーしました