プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

ツェラーのアルゴリズムで曜日を求める方法を解説

ツェラーのアルゴリズムとは

ツェラーのアルゴリズム(Zeller's Congruence)は、指定された日付(年・月・日)からその日の曜日を求めるための有名なアルゴリズムです。カレンダーの計算や日付処理のプログラムで広く利用されており、グレゴリオ暦に基づく任意の日付の曜日を簡単な数式で算出できるのが特徴です。

ツェラーのアルゴリズムで曜日を求めるための公式は以下の通りです。

ツェラーのアルゴリズムで曜日を求める方法を解説

公式に含まれる変数の意味

この公式には以下の変数が含まれています。

  • d — 日付の「日」を表します。
  • m — 月のコードです。3月から12月まではそのまま 3〜12 を使用しますが、1月は 13、2月は 14 として扱います。1月または2月を扱う場合は、年を 1 減らして計算します。
  • y — 年の下2桁です。
  • c — 年の上2桁(世紀の部分)です。
  • w — 計算結果の曜日を表します。0 なら土曜日、6 なら金曜日に対応します。

入力と出力

このアルゴリズムでは、日・月・年を入力として受け取り、その日が何曜日であったかを出力します。

入力:
日・月・年: 4, 1, 1997
出力:
その日は: 土曜日

アルゴリズムの手順

ツェラーのアルゴリズムは以下の疑似コードのように表すことができます。

zellersAlgorithm(day, month, year)

入力: 対象となる日付(日・月・年)。

出力: その日の曜日(日曜日〜土曜日)。

Begin
    if month > 2, then
        mon := month
    else
        mon := 12 + month
        decrease year by 1
    y := last two digit of the year
    c := first two digit of the year
    w := day + floor((13*(mon+1))/5) + y + floor(y/4) + floor(c/4) + 5*c
    w := w mod 7
    return weekday[w] //weekday will hold days from Saturday to Friday
End

処理の流れのポイント

  • 月が 3 より大きい場合は月コードをそのまま使用し、1月・2月の場合は月コードを 13・14 に変換して年を 1 減らします。
  • 年を下2桁(y)と上2桁(c)に分けて、それぞれを公式に代入します。
  • 最終的な値を 7 で割った余り(w mod 7)が曜日インデックスとなり、0 が土曜日、6 が金曜日に対応します。

C++での実装例

以下は、ツェラーのアルゴリズムをC++で実装したサンプルコードです。

#include<iostream>
#include<cmath>
using namespace std;

string weekday[7] = {"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"};

string zellersAlgorithm(int day, int month, int year) {
    int mon;
    if(month > 2)
        mon = month;      // 3月から12月は月コードが月と同じ
    else {
        mon = (12+month); // 1月と2月の場合、月コードは13と14になる
        year--;           // 1月・2月の場合は年を1減らす
    }

    int y = year % 100;   // 年の下2桁
    int c = year / 100;   // 年の上2桁
    int w = (day + floor((13*(mon+1))/5) + y + floor(y/4) + floor(c/4) + (5*c));
    w = w % 7;
    return weekday[w];
}

int main() {
    int day, month, year;
    cout << "Enter Day: "; cin >>day;
    cout << "Enter Month: "; cin >>month;
    cout << "Enter Year: "; cin >>year;
    cout << "It was: " <<zellersAlgorithm(day, month, year);
}

実行結果

上記のプログラムに 1997年1月4日 を入力した場合の実行結果は以下の通りです。

Enter Day: 04
Enter Month: 01
Enter Year: 1997
It was: Saturday

このように、1997年1月4日は土曜日であることが正しく求められました。ツェラーのアルゴリズムを使えば、複雑なカレンダーデータを参照することなく、数式だけで任意の日付の曜日を高速に計算できます。

  1. C言語グラフィックスで学ぶフラッドフィル(領域塗りつぶし)アルゴリズムの実装方法

    基本概念 フラッドフィル(Flood Fill:領域塗りつぶし)アルゴリズムは、指定した1点を起点として、同じ色でつながっている隣接ピクセルを順番に新しい色へ置き換えていく手法です。ペイントソフトの「塗りつぶしツール(バケツツール)」などでも使われている、コンピュータグラフィックスにおける基本的なアルゴリズムの一つです。 本記事では、C言語のグラフィックスライブラリ(graphics.h)を利用し、与えられた長方形の内部をフラッドフィルアルゴリズムで塗りつぶす方法を解説します。 入力例 rectangle(left = 50, top = 50, right = 100, bottom =

  2. Pythonでプリムのアルゴリズムを使って最小全域木(MST)を求める方法

    最小全域木(MST)とは?グラフが与えられたとき、そこから「最小全域木」(MST:Minimum Spanning Tree)を求めることを考えます。グラフのMSTとは、重み付きグラフの部分集合であり、すべての頂点が含まれており互いに接続され、かつ部分集合内に閉路(サイクル)が存在しないものを指します。「最小」と呼ばれるのは、MSTの辺の重みの合計が、元のグラフから構成できるどの全域木よりも小さくなるためです。この記事では、プリム(Prim)のMSTアルゴリズムを実装し、与えられたグラフからMSTの辺の重みの合計を求める方法を解説します。問題の例たとえば、次のようなグラフが入力として与えられた