【日付セット】曜日(large2) (paizaランク A 相当) 解答例 – PHP編【paiza】


【日付セット】 > 曜日(large2) (paizaランク A 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。

「曜日」の最終問題です。前回までは「date()」関数を利用してきましたが、今回の問題では「paiza歴」という実在しない架空の歴が使用されます。その為「date()」関数が使用できず、難易度が一気に上がります。幸いなことに閏年の規則性は一緒なので巨大な数値の対応方法は前回のものを流用できます。

解答例

解答方針

「while」によるループ処理によって、与えられた日付が「paiza歴0年1月1日木曜日」から何日後かをカウントします。このカウントを7で割り余りを求めます。この余りの値と曜日配列を対応させて曜日を求めます。
注意点はグレゴリオ暦とは違い、閏年、平年での日数の違いが12月に発生し、その他の月の日数は31日で固定されている点です。この事を加味し、対象年月日に達するまでの日数をカウントするプログラムを作っていきます。

 

問題データの取得と年月日への分割

標準入力で問題の年月日を取得します。各変数に保存して扱いやすくします。

 

大きすぎる年数に対応する為の補正部分

「$y4000」には「paiza歴4000年分の日数」を入れてあります。これはあらかじめ調べた計算結果になります。
この値を利用して、大きすぎる年数を補正した時、補正した年数分の日数をあらかじめカウントします。この処理をすることで、結果として後に行うループ処理の負荷が減ることになります。

 

「paiza歴0年1月1日」から対象年月日までループさせる

0年1月1日から1日ずつプラスさせてカウントしていきます。「$typeyear」変数を用意し現在の年数から「閏年」か「平年」かを判断します。今回は「0なら平年」、「1なら閏年」という形にしています。
paiza歴では平年、閏年の違いで12月の日数が31日から32日になります。
そのことに注意して日を表す「$d」がその月の日数を越えた場合、「$d」を1に振り直し、月を表す「$m」を一つ上げる、この時「$m」が13になったら「$m」を1に振り直し、年を表す「$y」を一つ上げる。
この処理を対象年月日に達するまで繰り返し、日数をカウントします。

 

日数のカウントから曜日を出力する

日数カウントから7で割り、余りを出します。曜日配列を作成し、求めた値から配列内の曜日を出力します。「paiza歴0年1月1日」は「木曜日」なので配列のキー0は「木曜日」に設定します。

 

エッグ

シェアする