-
C++で3×3行列の対角要素を埋め、行・列・対角線の合計をすべて等しくする方法
3×3の行列があり、最初は対角要素が空になっているとします。ここで、行・列・対角線の合計がすべて等しくなるように対角要素を埋めることを考えます(いわゆる魔方陣の性質です)。元の行列は以下のようになっているとします。対角要素を埋めた後は、次のようになります。対角要素の求め方対角要素を x、y、z とすると、それぞれの値は次の式で求められます。x = (M[2, 3] + M[3, 2]) / 2z = (M[1, 2] + M[2, 1]) / 2y = (x + z) / 2これは、「行・列・対角線の合計がすべて等しい」という条件を連立させることで、対角要素が残りの6つの要素から一意に導き出せ
-
C++を使って「数x + xの桁の合計 = n」となる数xを求める方法
ここでは、ある数nが与えられたとき、「数xとその桁の合計を足した値がnと等しくなる」ようなxを求める問題を扱います。例えば、nが21の場合、答えはx = 15となります。15の桁の合計は1 + 5 = 6なので、15 + 6 = 21 = nとなり、条件を満たすからです。この問題を解くには、シンプルなアプローチが有効です。0からnまでの数を順番に調べていき、各数値について「その数 + 桁の合計」がnと一致するかどうかを確認します。一致する数が見つかった時点でその値を返し、最後まで見つからなければ-1を返します。サンプルコード#include<iostream> using name
-
C++ですべての要素を割り切れる配列の要素を見つける方法
いくつかの要素を持つ配列 A があるとします。この中から「他のすべての要素を割り切ることができる」1つの要素を見つけたいと思います。例として、配列 A = [15, 21, 69, 33, 3, 72, 81] を考えてみましょう。この場合、答えは 3 になります。リスト内のすべての数値が3で割り切れるためです。解決策のアプローチこの問題は、以下の手順でシンプルに解くことができます。まず、配列内の最小値を求めます。次に、すべての要素がその最小値で割り切れるかどうかを確認します。すべて割り切れれば、その最小値を返します。1つでも割り切れない要素があれば、-1 を返します(条件を満たす要素は存在し
-
C++で左側の配列の合計と右側の配列の合計が等しくなる要素を配列内から検索する方法
問題の概要n個の要素を持つ配列Aがあるとします。この課題は、配列Aを2つの部分配列に分割したときに、それぞれの部分配列の要素の合計が等しくなるような分割点の要素を見つけることです。例えば、配列A = [2, 3, 4, 1, 4, 5]の場合、答えは「1」となります。要素1を境界として、左側の部分配列は[2, 3, 4]、右側の部分配列は[4, 5]となり、両者の合計はどちらも9で一致します。解法のアプローチこの問題は、累積和を利用することで時間計算量O(n)・空間計算量O(1)という高い効率で解くことができます。手順は以下のとおりです。まず、配列の最初の要素を除いた残りの要素すべての合計をr
-
C++で括弧文字列からイコールポイント(等分点)を見つける方法
この記事では、C++を使って括弧の文字列からイコールポイント(等分点)を求める方法を解説します。 イコールポイントとは? イコールポイントとは、あるインデックス i において、その位置より前にある開き括弧「(」の数と、その位置以降にある閉じ括弧「)」の数が等しくなる地点のことです。 例として、次の括弧文字列を考えてみましょう。 (()))( ()()() )) ) → 元の文字列は (()))(()()()))) この文字列を詳しく観察すると、インデックス0〜9の範囲に含まれる開き括弧は5個、インデックス9〜14の範囲に含まれる閉じ括弧も5個あります。したがって、インデックス9がこの文字列の
-
C++のSTL関数を使ってstd::vector内の重複する文字列を検索・表示する方法
文字列のリストを扱っていると、同じ文字列が複数回出現しているケースによく遭遇します。本記事では、C++のSTL(標準テンプレートライブラリ)を活用して、std::vector内に含まれる重複した文字列を効率的に検索し、画面に表示する方法を解説します。例として、次のような文字列リストを考えてみましょう。[Hello, Kite, Hello, C++, Tom, C++]このリストの場合、「Hello」と「C++」がそれぞれ2回出現しているため、これらを重複として検出する必要があります。アルゴリズムの考え方:ハッシュを活用した重複検出ここではハッシュテーブル(std::unordered_set
-
C++を使って隣接する2辺のベクトルから平行四辺形の面積を求める方法
平行四辺形の面積の計算方法平行四辺形の隣接する2辺に対応する2つのベクトルが、$x\hat{i}+y\hat{j}+z\hat{k}$ の形式で与えられているとします。このとき、平行四辺形の面積は、2つのベクトルの外積の大きさ(|A × B|)に等しくなります。ベクトル A = (x₁, y₁, z₁) と B = (x₂, y₂, z₂) が与えられた場合、面積は次の式で求められます。$$\rvert \vec{A}\times\vec{B}\rvert=\sqrt{\lgroup y_{1}*z_{2}-y_{2}*z_{1}\rgroup^{2}+\lgroup x_{1}*z_{2}-
-
C++で隣接する2辺のベクトルから三角形の面積を求める方法
三角形の面積を求める考え方三角形の隣接する2辺が、xî + yĵ + zk̂ の形式で表されるベクトル A と B として与えられているとします。このとき、三角形の面積は「2つのベクトルの外積の大きさの半分」で求められます。つまり、面積 = (1/2)|A × B| です。外積の各成分に展開すると、面積は次の式で表されます。$$\frac{1}{2}|\vec{A}\times\vec{B}|=\frac{1}{2}\sqrt{(y_{1}z_{2}-y_{2}z_{1})^{2}+(x_{1}z_{2}-x_{2}z_{1})^{2}+(x_{1}y_{2}-x_{2}y_{1})^{2}}
-
C++でceil()関数を使わずにa/bの切り上げ値(天井値)を求める方法
ここでは、標準ライブラリのceil()関数を使用せずに、a÷b の切り上げ値(天井値)を求める方法を解説します。例えば、a = 5、b = 4 の場合、a/b = 5/4 となり、その切り上げ値は 2 になります。切り上げ値を求める公式この問題は、次のシンプルな公式で解くことができます。ceil(a/b) = (a + b - 1) / bなぜこの公式が成り立つのかC++の整数除算では、小数点以下が切り捨てられます。そこで、分子に「b - 1」をあらかじめ加えておくことで、割り切れない場合にのみ結果が1つ上の整数へ繰り上がる仕組みです。割り切れる場合は (a + b - 1) がちょうど b
-
C++を使って行列内で合計が最大の列を見つける方法
ここでは、サイズ M × N の行列が与えられたときに、要素の合計が最大となる列を見つける方法を解説します。この問題では、難しいアルゴリズムを用いる必要はありません。行列を列方向に走査して各列の合計値を計算し、その合計が最大であれば、合計値と該当する列のインデックスを出力するというシンプルなアプローチで十分です。アルゴリズムの手順処理の流れは以下の通りです。1. 最大合計値を格納する変数 maxSum を INT_MIN で初期化し、列のインデックスを格納する index を -1 に設定します。2. 各列(0 ~ N-1)について、colSum 関数を使ってその列の要素の合計を計算します。3
-
C++で行列の2つの対角線の合計の差を求める方法
本記事では、与えられた行列における2つの対角線(主対角線と副対角線)の要素の合計の差を求める方法について解説します。N×Nの正方行列が与えられたとき、まず主対角線と副対角線それぞれの合計を計算し、その差の絶対値を求めて結果として返します。アルゴリズムの考え方主対角線(左上から右下へ向かう対角線)では、行インデックスと列インデックスが同時に増加していきます。つまり、matrix[i][i] の要素を順に加算することで合計を求められます。一方、副対角線(右上から左下へ向かう対角線)では、行インデックスと列インデックスの間に「row_index = n − 1 − col_index」という関係が成
-
C++でソートされていない配列からフロア値とシーリング値を検索する方法
フロア値とシーリング値とはこの記事では、ソートされていない配列からフロア値(floor)とシーリング値(ceiling)を求める方法を、C++のコード例とともに解説します。フロア値とは「x以下の要素のうち最大の値」、シーリング値とは「xより大きい要素のうち最小の値」を指します。たとえば、配列 A = [5, 6, 8, 9, 6, 5, 5, 6]、x = 7 の場合を考えてみましょう。7以下の最大の要素は 6、7より大きい最小の要素は 8 であるため、フロア値は 6、シーリング値は 8 となります。アルゴリズムの考え方この問題は、線形探索(リニアサーチ)のアプローチで効率よく解けます。配列を
-
【C++】算術平均と幾何平均から調和平均を求める方法
本記事では、算術平均と幾何平均の値から調和平均(Harmonic Mean)を求める方法を、C++のコード例とともに解説します。まず、3つの平均それぞれの定義式を確認しておきましょう。算術平均(AM):(a + b) / 2幾何平均(GM):√(a × b)調和平均(HM):2ab / (a + b)調和平均は、算術平均と幾何平均を用いて次の関係式で表すことができます。HM = GM² / AMこの関係を利用すると、調和平均を直接計算するのではなく、算術平均と幾何平均の2つの値を経由して求めることが可能です。サンプルコード#include <iostream> #include &
-
C++で初項と公差が与えられた等差数列(AP)に特定の数値が含まれるか判定する方法
等差数列(Arithmetic Progression:AP)の初項 a と公差 d が与えられたとき、指定した数値 x がその数列の項として存在するかどうかを判定する問題について解説します。例えば、初項 a = 1、公差 d = 3 の場合、数列は 1, 4, 7, 10, ... となります。ここで x = 7 が数列に含まれるかを調べると、答えは「はい」となります。解法のアプローチこの問題は、以下の手順で効率的に解くことができます。公差 d が 0 の場合: 数列は定数列になるため、a == x であれば true を返し、そうでなければ false を返します。公差 d が 0 でない
-
C++で2つの長方形が重なっているかどうかを判定する方法
長方形は、左上の角と右下の角という2つの座標点で表現できます。本記事では、2つの長方形が与えられたときに、それらが互いに重なっているかどうかを判定する方法をC++で解説します。判定に使用するのは、次の4つの座標点です。l1:1つ目の長方形の左上の角r1:1つ目の長方形の右下の角l2:2つ目の長方形の左上の角r2:2つ目の長方形の右下の角ここでは、両方の長方形が座標軸に平行であると仮定します。この場合、次の2つの条件を確認するだけで重なりを判定できます。重なっていないと判定される条件以下のいずれかが成立する場合、2つの長方形は重なっていません。片方の長方形が、もう片方の長方形の上端よりも上にある
-
C++で数値の最大の素因数を求める方法
ある整数 x が与えられたとき、その最大の素因数を求めることを考えます。例えば、x = 6 の場合、6 を素因数分解すると 2 × 3 となるため、最大の素因数は 3 です。 この問題は、対象の数を小さい約数から順に割り続けて素因数分解を行い、その過程で現れる素因数のうち最も大きいものを記録していくことで解くことができます。 アルゴリズムの流れ n が偶数である限り 2 で割り続け、素因数として 2 を記録します。 3 から √n までの奇数 i について、n が i で割り切れる限り割り続け、i を素因数として記録します。 ループ終了後も n が 2 より大きければ、残った n 自体が素
-
C++でN階乗の合計の下2桁を求める方法
本記事では、1!からN!までの階乗の合計について、その下2桁(一の位と十の位)を求める方法を解説します。例えば N = 4 の場合、1! + 2! + 3! + 4! = 33 となるため、一の位は「3」、十の位は「3」であり、結果は「33」となります。この問題には重要な性質があります。N が 5 より大きい場合、その階乗の一の位は必ず 0 になるため、6! 以降の項は一の位に一切影響を与えません。同様に、N が 10 以上になると十の位も 0 のまま変化しなくなります。したがって、N = 10 以上では結果は常に「13」で固定されます。実際に N = 1 から 10 までの階乗の値を表に整理
-
C++で構造体配列から最大値を検索する方法
はじめに本記事では、C++を使って構造体配列の中から最大値を持つ要素を検索する方法を解説します。例として、以下のような「身長(フィートとインチ)」を表す構造体が与えられた場合を考えます。struct Height{ int feet, inch; };この構造体型の配列から、最も身長の高い要素を見つけることが目標です。アルゴリズムの考え方アプローチは非常にシンプルです。以下の手順で処理を進めます。配列を先頭から順に走査する。各要素の身長をインチ単位に換算する。換算式は「12 × フィート + インチ」。現在の最大値と比較し、より大きい値が見つかれば、その値とインデックスを更新する。最終
-
【C++】素因数分解で約数の和の最小値を求めるアルゴリズムを解説
約数の和の最小値を求める問題とは この記事では、与えられた整数の「約数の和の最小値」を求めるアルゴリズムを、C++で実装しながら解説します。 例として、数12を考えてみましょう。12は以下のように複数の方法で因数分解できます。 12 = 12 × 1 → 和は 12 + 1 = 13 12 = 2 × 6 → 和は 2 + 6 = 8 12 = 3 × 4 → 和は 3 + 4 = 7 12 = 2 × 2 × 3 → 和は 2 + 2 + 3 = 7 この中で最小となる和は7です。本記事では、任意の整数nが与えられたとき、この最小の和を効率よく求める方法を紹介します。 アプローチ:素因数
-
C++を使ってAとBの間のN個の相加平均(等差中項)を求める方法
問題の概要 3つの整数 A、B、N が与えられたとき、A と B の間に N 個の相加平均(等差中項)を挿入することを考えます。例えば、A = 20、B = 32、N = 5 の場合、出力は「22, 24, 26, 28, 30」になります。 解法の考え方 この課題は非常にシンプルです。A を初項、B を末項とする等差数列の中に、N 個の要素を挿入すればよいのです。 挿入する N 個の相加平均を A1, A2, …, An とすると、数列全体は次のようになります。 A, A1, A2, …, An, B このとき、B は数列の (N + 2) 番目の項に相当します。したがって、等差数列の一般