指定した年数までの奇数日数を計算する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になります。
-
配列内で奇数回出現する数値を見つけるC/C++プログラム
正の整数からなる配列の中で、奇数回出現する数値を見つけるC++プログラムを紹介します。この配列では、答えとなる1つの数だけが奇数回出現し、それ以外のすべての数値は偶数回出現するものとします。 入力: arr[] = {5, 7, 8, 8, 5, 8, 8, 7, 7} 出力: 7 アルゴリズムの解説 この方法では、二重ループを使用します。外側のループで配列の各要素を1つずつ順番に走査し、内側のループでその要素が配列全体に出現する回数をカウントします。カウントした結果が奇数であれば、その要素が求める答えとなります。 上記の例では、数値「5」は2回、「8」は4回出現していますが、「7」だけが3
-
【C++】グラフ内の橋(ブリッジエッジ)の数を検出するプログラムの解説
ブリッジエッジ(橋)とは? 重みなし無向グラフにおけるブリッジエッジ(橋)とは、その辺を取り除いたときにグラフが非連結(複数の連結成分に分断される)となるような辺のことです。本記事では、n個の頂点とm個の辺からなるグラフが与えられたとき、その中に含まれるブリッジの数を求めるC++プログラムを紹介します。なお、対象となるグラフには平行辺や自己ループは含まれないものとします。 問題の例 例として、n = 5、m = 6、edges = {{1, 2}, {1, 3}, {2, 3}, {2, 4}, {2, 5}, {3, 5}} という入力が与えられた場合を考えてみましょう。この場合の出力は