はじめに
昨日のサマーウォーズの再放送を見て、やってみよ〜と思ったので、モジュロ計算による曜日当てをプログラムで再現してみました。
アルゴリズムはwikipediaを参照しました。
簡単に言えばmod使って計算すると上手く曜日を出せるよってことらしいです。
ソースコード
#include <iostream> int main(){ //初期化 int year = 0, month = 0, day = 0; //入力方法表示 std::cout << "Year Month Day" << std::endl; //標準入力からデータ取得 std::cin >> year >> month >> day; if(year < 0){ year++; } if(month == 1 || month == 2){ month += 12; year--; } //公式に利用する数値の格納 const int C = year/100; const int Y = year%100; //暦で変わる変数 int T = 0; if(year > 1582){ T = -2*C + C/4; }else{ T = -C + 5; } //曜日を格納する変数 int h = (day + 26*(month+1)/10 + Y + Y/4 + T)%7; //表示 switch(h){ case 0: std::cout << "土曜日" << std::endl; break; case 1: std::cout << "日曜日" << std::endl; break; case 2: std::cout << "月曜日" << std::endl; break; case 3: std::cout << "火曜日" << std::endl; break; case 4: std::cout << "水曜日" << std::endl; break; case 5: std::cout << "木曜日" << std::endl; break; case 6: std::cout << "金曜日" << std::endl; break; default: break; } return 0; }
実行してみた
昨日は2019年7月19日で金曜ロードショウで再放送されていたので、金曜日で合ってますし、今年の私の誕生日は日曜日だったので確かです。
./modulo Year Month Day 2019 7 19 金曜日 ./modulo Year Month Day 2019 1 13 日曜日
最後に
公式通りに作ったら簡単すぎました。
暗算できるレベルではないですけどね〜。
コメント