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

指定した年数までの奇数日数を計算するC++プログラム

正の整数 n が与えられたとき、1年目から n 年目までに含まれる「奇数日(odd days)」の総数を求めるのが、このプログラムの目的です。奇数日とは、総日数を1週間の日数である7で割った余りのことで、カレンダー計算の基礎となる重要な概念です。

実行例

入力: days = 500
出力: 奇数日の数: 5
入力: days = 400
出力: 奇数日の数: 0

奇数日数の計算方法

奇数日を計算する際に最初に確認すべきは、対象の年が閏年かどうかという点です。閏年か平年かによって、1年あたりの奇数日の数が変わるためです。閏年の判定基準は以下のとおりです。

  • 4で割り切れる年は閏年である
  • ただし、100で割り切れる年は平年となる
  • さらに、400で割り切れる年は閏年となる

総日数を7で割った余り(剰余)を求めると、それがその期間の奇数日数になります。平年は365日なので奇数日は1日、閏年は366日なので奇数日は2日です。

本プログラムで採用しているアプローチは以下のとおりです。

  • 年数を入力として受け取る
  • その年が閏年か平年かを判定する
  • 総日数の剰余を計算して奇数日数を求める
  • 1年目から n 年目までの奇数日の合計を結果として表示する

アルゴリズム

開始
ステップ1: 指定された年数の奇数日数を計算する関数を宣言する
    int cal_odd(int days)
    int cal_1 = days / 100 を宣言
    int cal_2 = days / 400 を宣言
    int check_leap = days >> 2 を宣言
    int temp = days - check_leap を宣言
    IF (cal_1)
        temp += cal_1 とする
        check_leap -= cal_1 とする
    End
    IF (cal_2)
        temp -= cal_2 とする
        check_leap += cal_2 とする
    End
    int final_days = temp + check_leap * 2 を宣言
    int odd = final_days % 7 を宣言
    return odd
ステップ2: main() 内で
    int days = 500 を宣言
    cal_odd(days) を呼び出す
終了

サンプルコード

#include <iostream>
using namespace std;
// 指定された年数の奇数日数を計算する関数
int cal_odd(int days) {
    int cal_1 = days / 100;
    int cal_2 = days / 400;
    int check_leap = days >> 2;
    int temp = days - check_leap;
    if (cal_1) {
        temp += cal_1;
        check_leap -= cal_1;
    }
    if (cal_2) {
        temp -= cal_2;
        check_leap += cal_2;
    }
    int final_days = temp + check_leap * 2;
    int odd = final_days % 7;
    return odd;
}
int main() {
    int days = 500;
    cout<<"奇数日の数 : "<<cal_odd(days);
    return 0;
}

コードの解説

関数 cal_odd() では、以下の手順で計算を行っています。

  • days / 100: 100年単位の世紀の数を求めます。100で割り切れる年は通常平年として扱うため、閏年候補から除外します。
  • days / 400: 400年単位の数を求めます。400で割り切れる年は閏年であるため、再び閏年候補に加えます。
  • days >> 2: 2ビット右シフトにより4で割ることで、閏年候補の総数を高速に求めています。
  • 平年の数に1日分、閏年の数に2日分の奇数日を加算し、その合計を7で割った余りを返します。

出力

奇数日の数 : 5

このように、500年間の奇数日数は5日となります。なお、days = 400 を入力した場合は、400年周期で奇数日がちょうど0に戻るため、出力は0になります。

  1. 配列内で奇数回出現する数値を見つけるC/C++プログラム

    正の整数からなる配列の中で、奇数回出現する数値を見つけるC++プログラムを紹介します。この配列では、答えとなる1つの数だけが奇数回出現し、それ以外のすべての数値は偶数回出現するものとします。 入力: arr[] = {5, 7, 8, 8, 5, 8, 8, 7, 7} 出力: 7 アルゴリズムの解説 この方法では、二重ループを使用します。外側のループで配列の各要素を1つずつ順番に走査し、内側のループでその要素が配列全体に出現する回数をカウントします。カウントした結果が奇数であれば、その要素が求める答えとなります。 上記の例では、数値「5」は2回、「8」は4回出現していますが、「7」だけが3

  2. 【C++】グラフ内の橋(ブリッジエッジ)の数を検出するプログラムの解説

    ブリッジエッジ(橋)とは? 重みなし無向グラフにおけるブリッジエッジ(橋)とは、その辺を取り除いたときにグラフが非連結(複数の連結成分に分断される)となるような辺のことです。本記事では、n個の頂点とm個の辺からなるグラフが与えられたとき、その中に含まれるブリッジの数を求めるC++プログラムを紹介します。なお、対象となるグラフには平行辺や自己ループは含まれないものとします。 問題の例 例として、n = 5、m = 6、edges = {{1, 2}, {1, 3}, {2, 3}, {2, 4}, {2, 5}, {3, 5}} という入力が与えられた場合を考えてみましょう。この場合の出力は