C++で次にカレンダーが一致する年(同一暦年)を検索する方法
問題の概要
ある年 Y が与えられたとき、Y とカレンダーが完全に一致する次の年を見つける問題を考えます。例えば、2017年のカレンダーは2023年のカレンダーと同一になっています。
年 X が過去の年 Y と同一の暦年であるとみなされるためには、次の2つの条件を満たす必要があります。
- X が Y と同じ曜日から始まること
- Y が閏年なら X も閏年、Y が平年なら X も平年であること
アルゴリズムの考え方
基本的な発想は、翌年から1年ずつ順番にチェックしていくことです。その際、開始曜日が何日分ずれたかを累積で追跡します。1年が経過するごとに、その年の日数を7で割った余りだけ曜日がずれます。具体的には、平年は365日(365 ÷ 7 = 52 余り 1)なので1日、閏年は366日(366 ÷ 7 = 52 余り 2)なので2日ずれることになります。
累積したずれが7の倍数(7で割った余りが0)になったとき、その年は元の年と同じ曜日から始まります。さらに、その年が閏年かどうかを Y と照らし合わせ、両方の条件が揃った時点でその年を答えとして返します。
コード例
#include<iostream>
using namespace std;
int countExtraDays(int y) {
if (y%400==0 || y%100!=0 && y%4==0)
return 2;
return 1;
}
int nextIdenticalYear(int y) {
int days = countExtraDays(y);
int x = y + 1;
for (int sum=0; ; x++) {
sum = (sum + countExtraDays(x)) % 7;
if ( sum==0 && (countExtraDays(x) == days))
return x;
}
return x;
}
int main() {
int curr = 2019;
cout << "Next identical year of " << curr <<" is: " << nextIdenticalYear(curr);
}
出力
Next identical year of 2019 is: 2030
コードの解説
countExtraDays 関数は、引数で受け取った年が閏年かどうかを判定し、閏年なら2、平年なら1を返します。閏年の判定条件は「400で割り切れる年」または「100で割り切れず、かつ4で割り切れる年」です。
nextIdenticalYear 関数では、まず基準となる年 Y のずれ量(1または2)を取得し、翌年から順に各年のずれ量を累積加算していきます。累積値が7で割り切れ(同じ曜日で始まることを意味する)、かつ閏年・平年の区分が Y と一致した年を見つけた時点で、その年を返します。
この例では、2019年(平年)と同じ暦となる次の年は2030年であることが確認できます。
-
C++で三角形の重心を求めるプログラムの作成方法
この記事では、三角形の3つの頂点の座標を格納した2次元配列が与えられたときに、その三角形の重心を求めるC++プログラムの作成方法を解説します。 三角形の重心とは、三角形の3本の中線がすべて交わる点のことです。 また、三角形の中線とは、ある頂点と、その対辺(向かい合う辺)の中点を結ぶ線分のことを指します。 それでは、具体的な例を使って問題を確認してみましょう。 入力 (-3, 1), (1.5, 0), (-3, -4) 出力 (-1.5, -1) 説明 重心 (x, y) = ((-3 + 1.5 - 3) / 3, (1 + 0 - 4) / 3) = (-1.5, -1) 解法のアプロ
-
C++で平行四辺形の面積を求めるプログラムの作成方法
この記事では、平行四辺形の底辺と高さを表す2つの値が与えられたとき、C++を使ってその面積を求めるプログラムを作成する方法を解説します。 平行四辺形とは? 平行四辺形とは、4つの辺からなる閉じた図形であり、向かい合う2組の辺がそれぞれ長さが等しく、互いに平行になっている四角形のことです。 問題を理解するための具体例 入力 B = 20, H = 15 出力 300 説明 平行四辺形の面積 = 底辺 × 高さ = 20 × 15 = 300 解決アプローチ この問題を解くには、平行四辺形の面積を求める幾何学の公式を使用します。 面積 = 底辺 × 高さ つまり、与えられた底辺と高さを掛け合わせ