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

月と初日の曜日からカレンダーの列数を求めるC++コード

2つの整数 m(月)と d(その月の1日の曜日)が与えられたとします。ここでは、曜日が列として並び、日付が各行に埋められていくカレンダーを考えます。このとき、月 m と1日の曜日 d が分かっていれば、カレンダー全体を表示するのに何列必要かを求めることができます(うるう年は考慮しないものとします)。

例えば、入力が m = 11d = 6 の場合、出力は 5 になります。11月1日が土曜日にあたり、5列あれば1か月分の日付をすべて収められるためです。

解き方の手順

この問題は、次の手順で解くことができます。

大きさ13の配列 a を定義 := { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
return (a[m] + d + 5) / 7

計算式のポイント

配列 a には各月の日数が格納されています。d を「月曜日を1とする曜日番号」とすると、カレンダーの先頭セル(週の始まり)から1日までのずれは d − 1 となるため、必要な列数は「(その月の日数 + d − 1) ÷ 7」の切り上げに等しくなります。整数除算では (x + 6) / 7x の切り上げに相当するので、この式は (a[m] + d + 5) / 7 と簡潔に書けます。

実装例

理解を深めるために、実際のC++による実装を見てみましょう。

#include <bits/stdc++.h>
using namespace std;
int solve(int m, int d){
    int a[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    return (a[m] + d + 5) / 7;
}
int main(){
    int m = 11;
    int d = 6;
    cout << solve(m, d) << endl;
}

入力

11, 6

出力

5
  1. C++で先頭と末尾の桁が同じ数字になる数を数える方法

    区間 [first, last] が与えられたとき、この範囲内で「先頭の桁」と「末尾の桁」が同じ数値がいくつ存在するかを求めるのが本記事の目的です。例えば 232 という数値は、先頭の桁も末尾の桁も 2 で一致しています。この問題は、i = first から i = last まで順番に走査することで解決できます。各数値について先頭の桁と末尾の桁を比較し、両者が一致していればカウントを1つずつ増やしていきます。それでは、具体的な例で確認してみましょう。入力 − first = 8, last = 40出力 − 先頭と末尾の桁が同じ数値の個数:5説明 − 8 から 40 の間で先頭と末尾の桁が同

  2. C++で前半と後半のビット合計が等しい偶数長バイナリ列の個数を求める方法

    問題概要 バイナリ列(0と1からなる数列)に対して、その半分の長さにあたるビット数 n が入力として与えられます。求めたいのは、前半 n ビットの合計(1の個数)と後半 n ビットの合計が一致する、長さ 2n のバイナリ列の総数です。 バイナリ列なので、各位置に入れられる値は 0 か 1 のみです。まず、n ビットの中に含まれる 1 の個数ごとの組み合わせ数を整理してみましょう。 1 が 0 個:nC0 = 1 通り 1 が 1 個:nC1 通り 1 が 2 個:nC2 通り …… 1 が n 個:nCn 通り 次に、長さ 2n の列全体を考えます。前半と後半で合計が一致するためには