カタン: 2008年3月アーカイブ
昨日紹介しました曜日を求める式「ツェラー(Zeller)の公式」、参考までにC言語で書いてみました。
別に他の言語で書いてもよいのですが、せっかくこのblogにC言語カテゴリがあるので。
#include <stdio.h>
int main(void){
int y,m,d,h;
char *w[7]={"日","月","火","水","木","金","土"};
printf("年を入力してください:");
scanf("%d",&y);
printf("月を入力してください:");
scanf("%d",&m);
printf("日を入力してください:");
scanf("%d",&d);
if(m < 3){
y--;
m+=12;
}
h = (y + y/4 - y/100 + y/400 + (13 * m + 8)/5 + d)%7;
printf("その日は%s曜日です",w[h]);
return 0;
}
新しい知識得ることは大きな喜びです。
新しい知識を得たとき、わたしはこのblogに書くことが多いです。
それはその知識が役に立つ人が少しはいるかもしれないという思いがあるのと同時に、得た知識を忘れても思い出せるように。
人間の記憶なんて曖昧なものですので。
ツェラー(Zeller)の公式、初めて知ったときはかなり驚きだったことを覚えています。
かなり前に知った知識なのですが、こちらに書いていなかったので今回書くことにしました。
ツェラー(Zeller)の公式、どういったものなのかといいますと、年月日を元にしてその日の曜日を求める公式です。
日付も曜日も法則性に基づいているため、冷静に考えてみれば驚くようなことではないのかもしれないですが、曜日はカレンダーで調べるしかないと決めつけていたわたしにはけっこうな衝撃でした。カレンダーが作れる時点で数式で求められるということだなんて考えもしませんでした。
ちなみに、日付の法則性とは
・各月の日数は2月以外決まっている
・4で割り切れて100で割り切れない年、あるいは、400で割り切れる年は2月が29日までとなる
といったことです。
※グレゴリオ暦(現在使われている暦の考え方)を前提として話しています。
※ツェラーの公式はユリウス暦でも式を変えることによって使用可能なようです。
どういった式かと言いますと
西暦をy、月をm、日をdとしたとき
曜日=(y+y/4-y/100+y/400+(13×m+8)/5+d)mod7
ただし、小数点演算は小数点を切り捨てた整数にする
modは剰余(割り算をした際の余り)を示す
1月及び2月の場合は前年の13月及び14月と考える(たとえば2008年2月は2007年14月と考える)
求められた曜日は0を日曜、1を月曜……6を土曜とする。
という式です。
実際に2008年3月1日から土曜日が求められるか試してみましょう。
(y+y/4-y/100+y/400+(13×m+8)/5+d)mod7
=(2008+2008/4-2008/100+2008/400+(13×3+8)/5+1)mod7
=(2008+502-20+5+47/5+1)mod7
=(2008+502-20+5+9+1)mod7
=(2505)mod7
=6
6は土曜日なので、確かに正解が導かれています。
この式を使用するならカレンダーを見た方が早いと思うかもしれません(曜日を知りたい日付の載ったカレンダーが近くにあればですが)。
確かに、人間がこの式で計算したなら、かなりの時間がかかるでしょう。
ツェラーの公式はプログラム言語の学習でよく出てくるものです。
このぐらいの計算はコンピュータを使えばあっという間に行ってくれます。
実際のところはわかりませんが、ネット上にある様々なカレンダーはこの公式を使用して曜日を求めているのだと思います。
そう考えると、非常に身近な数式に感じられます。