-
C++で二分木内の指定キーの次の右ノードを検索する方法
問題概要この問題では、二分木(Binary Tree)とキー値が与えられます。目的は、指定されたキーを持つノードの次の右ノードを見つけることです。二分木とは、各ノードが最大2つの子ノード(左の子と右の子)を持つ特殊なデータ構造で、データの格納や効率的な探索に広く活用されています。具体例で理解しよう入力key = 4出力5説明ノード4と同じレベルに位置し、その右隣にある要素は5です。したがって、答えは5となります。解決アプローチこの問題に対するシンプルな解決策は、幅優先探索(レベル順走査)を用いて二分木を走査することです。具体的には、以下の手順で処理を行います。キューを使用してレベル順にノードを
-
C++で配列内の「次に大きい要素の次に小さい要素」を効率的に検索する方法
問題の概要この問題では、n個の整数で構成される配列 arr[] が与えられます。各要素について、まず配列内でその要素より大きい「次に大きい要素(Next Greater)」を見つけ、続いてその大きい要素に対してさらに小さい「次に小さい要素(Next Smaller)」を求めるのがタスクです。もし次に大きい要素、あるいはその次に小さい要素が配列内に存在しない場合は、-1 を返します。入力例と出力例入力arr[] = {4, 2, 8, 3, 9, 1}出力{3, 3, 1, 1, -1, -1}説明まず各要素の「次に大きい要素」の配列を作ると {8, 8, 9, 9, -1, -1} となります
-
C++で次のスパース数を効率的に求める方法
この記事では、整数Nが与えられたときに、Nより大きい最小の「スパース数」を求めるプログラムをC++で作成する方法を解説します。 スパース数とは? スパース数とは、2進数表現に隣接する1が一切含まれない特殊な数のことです。 例:5(101)、16(10000) 問題の概要 与えられた数Nに対して、Nより大きい数の中で最小のスパース数を見つける必要があります。 入力例 N = 7 出力例 8 解説 8の2進数表現は「1000」であり、これが7より大きい最小のスパース数となります。 解法1:単純なアプローチ(線形探索) 最もシンプルな解決策は、Nより大きい数を順番にチェックし、最初に見つかったスパー
-
C++でn番目のエルミート数を求める方法
この記事では、整数 N が与えられたときに、n番目のエルミート数(Hermite Number) を求めるプログラムをC++で作成する方法を解説します。 エルミート数とは エルミート数とは、引数が0の場合におけるエルミート多項式の値のことです。 n番目のエルミート数は、以下の漸化式で定義されます。 HN = (-2) × (N − 1) × H(N−2) 初期値は H₀ = 1、H₁ = 0 です。 エルミート数列は次のように続きます。 1, 0, -2, 0, 12, 0, -120, 0, 1680, 0 … 入出力例 入力: N = 7 出力: 0 入力: N = 6 出力: -120
-
【C++】数列 1, 6, 15, 28, 45, … のN番目の項を求めるプログラム
問題概要この問題では、整数値 N が与えられます。求めるのは、数列「1, 6, 15, 28, 45, …」の N番目の項 を計算するプログラムです。この数列には、「各要素は、その前後の要素の平均値より2小さい」という面白い性質があります。具体例を見て、問題を理解しましょう。入力N = 5出力45解法アプローチ数列 1, 6, 15, 28, 45, … を詳しく観察すると、隣接する項同士の差は「5, 9, 13, 17, …」となっており、これ自体が公差4の等差数列になっています。このような2階等差数列の一般項は、二次式で表すことができます。実際、この数列は六角数(ヘキサゴナル数)と呼ばれる
-
【C++】数字根がXとなるN番目の正の整数を求める方法
問題概要 この問題では、2つの整数値 N と X が与えられます。求めるのは、「数字根(デジタルルート)が X となる正の整数のうち、N 番目の数」を計算するプログラムです。 数字根(Digital Root)とは、ある数の各桁の合計を計算し、その結果が1桁になるまで同じ操作を繰り返すことで得られる、1桁の正の整数のことです。 具体例で理解しよう 入力 N = 5, X = 4 出力 40 この例では、数字根が4となる正の整数は「4, 13, 22, 31, 40, …」という順に現れるため、その5番目の値である「40」が答えになります。 解法①:全探索によるシンプルな方法 最も基本的な解法は
-
C++でN番目の項を求める方法(行列累乗の活用例)
この問題では、整数Nと、N番目の項をそれ以前の項の関数として定義する漸化式が与えられます。求めるのは、N番目の項を計算するプログラムです。ここでは、再帰による単純な解法と、行列累乗(Matrix Exponentiation)を使った効率的な解法の2通りを解説します。今回扱う漸化式は以下のとおりです。T(n) = 2 * T(n-1) + 3 * T(n-2)初期値:T(0) = 1、T(1) = 1入力例と出力例入力:N = 4出力:41計算の流れ:T(4) = 2 * T(3) + 3 * T(2)T(4) = 2 * (2 * T(2) + 3 * T(1)) + 3 * (2 * T(
-
数列 1、4、15、72、420… のN番目の項を求めるC++プログラム
この記事では、整数 N が与えられたときに、次の数列のN番目の項を求めるプログラムをC++で作成します。対象となる数列: 1, 4, 15, 72, 420…入力と出力の例入力N = 4出力72解法のアプローチこの問題を効率的に解くには、数列のパターンを観察して、N番目の項を表す一般式(公式)を導き出すことが重要です。まず、この数列は「階乗」と「ある変数」の積として表現できることに注目してみましょう。1, 4, 15, 72, 420… 1!*(X1), 2!*(X2), 3!*(X3), 4!*(X4), 5!*(X5)... 1*(1), 2*(2), 6*(5/2), 24*(3), 1
-
数列 0, 2, 4, 8, 12, 18… のN番目の項を求めるC++プログラム
問題概要 この問題では、整数 N が与えられます。求めるのは、数列 0, 2, 4, 8, 12, 18 … のN番目の項です。数列のパターンを観察して一般項(公式)を導き出し、それを計算するC++プログラムを作成しましょう。 入出力の例 まず、具体例を使って問題を確認します。 入力 N = 5 出力 12 N = 5 のとき、数列の5番目の項は 12 となります。 解法アプローチ 最も効率的な解法は、数列のN番目の項を表す一般項(公式)を導出することです。そのためには、まず数列を注意深く観察し、パターンを一般化する必要があります。 数列の観察 隣り合う項同士の差に注目すると、次のような
-
級数 1, 2, 2, 4, 4, 4, 4, 8, 8, 8… のN番目の項を求めるC++プログラム
この問題では、整数 N が与えられ、級数「1, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8…」の N 番目の項を求めるプログラムを作成します。この級数は「1」が1回、「2」が2回、「4」が4回、「8」が8回というように、各値がその値と同じ回数だけ繰り返されるのが特徴です。つまり、2のべき乗の値が出現回数ぶんだけ連続して並ぶ、規則的な構造を持っています。具体例で問題を確認してみましょう。入力N = 7出力4N = 7 の場合、級数は「1, 2, 2, 4, 4, 4, 4」と並ぶため、7番目の項は「4」になります。解法1:ループを使った単純なアプローチ最も基
-
数列 1, 1, 2, 6, 24, ... のN番目の項を求めるC++プログラム
この問題では、整数 N が与えられます。求めたいのは、次の数列のN番目の項です。1, 1, 2, 6, 24, ...入力例N = 7出力例720解説この数列は以下のように続きます。1, 1, 2, 6, 24, 120, 720各項が直前の項に1ずつ増える整数を掛けていることに注目すると、この数列は階乗で構成されていることがわかります。つまり、N番目の項は (N−1) の階乗に等しくなります。解法アプローチこの問題を解く最もシンプルな方法は、数列の一般項を表す公式を利用することです。N番目の項 = (N−1)!この公式を使えば、ループで1から (N−1) までの積を計算するだけで答えが求まり
-
数列 1, 5, 32, 288 ... のN番目の項を求めるC++プログラム
この問題では、整数 N が与えられます。私たちのタスクは、数列 1, 5, 32, 288 ... のN番目の項を求めるプログラムを作成することです。 具体例を見て、問題を理解しましょう。 入力 N = 4 出力 288 説明 4番目の項 − (44) + (33) + (22) + (11) = 256 + 27 + 4 + 1 = 288 解法アプローチ この問題を解く最もシンプルな方法は、数列の一般項を表す公式を利用することです。その公式は次のとおりです。 N番目の項 = (NN) + ((N−1)(N−1)) + … + (22) +
-
数列 1、6、18、40、75、… のN番目の項を求めるC++プログラム
この問題では、整数 N が与えられます。求めたいのは、次の数列のN番目の項です。1, 6, 18, 40, 75, …まず、具体例を使って問題を確認してみましょう。入力N = 4出力40説明4番目の項は、次のように計算できます。(4 × 4 × 5) / 2 = 40解法アプローチこの問題を解く最もシンプルな方法は、数列の一般項(N番目の項を表す公式)を利用することです。この数列は次の公式で表せます。N番目の項 = ( N × N × (N + 1) ) / 2この公式に各項の値を代入して検証してみると、N = 1 のとき:(1 × 1 × 2) / 2 = 1N = 2 のとき:(2 × 2
-
C++で数列 1, 8, 54, 384, … のN番目の項を求めるプログラム
問題概要 この問題では、整数 N が与えられます。求めたいのは、次の数列の N番目の項 です。 1, 8, 54, 384, … 入出力の例 入力: N = 4 出力: 384 説明: 数列の4番目の項は、4 × 4 × 4! = 384 と計算できます。 解法アプローチ この問題を解く最もシンプルな方法は、数列の一般項(第N項)を表す公式を使うことです。各項は以下の式で求められます。 N番目の項 = N × N × (N!) つまり、「Nの2乗」に「Nの階乗(N!)」を掛けた値が、そのまま答えになります。この規則性を見抜ければ、あとは単純な計算処理だけで任意の項を導き出せます。 C++
-
C++で数列3, 14, 39, 84, ...のN番目の項を求めるプログラムの作成方法
問題の概要この問題では、整数 N が与えられ、数列 3, 14, 39, 84, ... のN番目の項を求めるプログラムをC++で作成します。入出力例具体的な例を使って、問題を理解しましょう。入力:N = 4出力:84説明:4番目の項は、(4×4×4) + (4×4) + 4 = 64 + 16 + 4 = 84 となります。解法アプローチこの問題を解く最もシンプルな方法は、数列のN番目の項を表す一般項(一般式)を利用することです。各項を分解して観察すると、次のパターンが見えてきます。N番目の項 = N³ + N² + N実際に各項を確認してみましょう。1番目の項: 1³ + 1² + 1 =
-
数列 5, 2, 19, 13, 41, … の第N項を求めるC++プログラム
この問題では、整数 N が与えられ、「5, 2, 19, 13, 41, 31, 71, 57 …」という数列の第N項を求めるプログラムを作成します。 まず、具体例を使って問題を確認しましょう。 入力 N = 5 出力 41 説明 この数列は「5, 2, 19, 13, 41, …」と続いていきます。第5項にあたる値は41です。 解法アプローチ 本問題を効率的に解くには、数列の一般項(第N項を表す公式)を利用します。ポイントは、この数列がNの偶奇によって異なる規則性を持っているという点です。具体的には、次の式で第N項を求められます。 Nが偶数の場合(N % 2 == 0):第N項 = (N−1
-
数列 5, 13, 25, 41, 61, … の第N項を求めるC++プログラム
問題の概要この問題では、整数 N が与えられます。私たちのタスクは、数列「5, 13, 25, 41, 61, …」の第 N 項を求めるプログラムを作成することです。問題を理解するための例入力N = 5出力61説明数列は 5, 13, 25, 41, 61 … と続いていきます。5 番目の項は 61 です。解法アプローチこの問題を解くシンプルな方法は、数列の第 N 項を表す一般式を利用することです。数列を観察すると、隣接する項の差が 8, 12, 16, 20 と 4 ずつ増加しています。これは二次数列の典型的な特徴であり、第 N 項は次の一般式で表されます。N番目の項 = (N × N) +
-
C++で約数の配列から元の数を求める方法
この問題では、ある数 Num の約数からなる N 個の整数の配列 divisors[] が与えられ、その約数のリストから元の数を特定することが課題となります。なお、約数の配列には 1 とその数自身は含まれません。具体例で問題を確認しましょう。入力divisors[] = {3, 25, 5, 15}出力75説明数 75 の約数は {3, 25, 5, 15} です解法のアプローチこの問題を解く鍵となるのは、数の最小の約数と最大の約数を組み合わせることです。元の数 Num は次の式で求められます。Num = 最小の約数 × 最大の約数そのため、まず配列 divisors[] を昇順にソートし、先
-
C++で2つの日付間の日数を計算する方法【効率的なアルゴリズム解説】
この記事では、日付を表す3つの整数(DD-MM-YYYY形式)からなる2つの配列 date1[] と date2[] が与えられたとき、その2つの日付の間の日数を求める方法を解説します。 問題を理解するための例 入力 date1[] = {13, 3, 2021}, date2[] = {24, 5, 2023} 出力 802 説明 2つの日付の差は「2年」と「2か月(3月〜5月)」、そして「11日」です。これを日数に換算すると以下のようになります。 2 × 365 + (30 + 31) + 11 = 802 解法アプローチ 単純なアプローチ(ループによる方法) 最もシンプルな解決策は、開始
-
C++で行列内のエンドレスポイント(無限ポイント)の数を求める方法
問題概要 この問題では、2次元配列 mat[n][m] が与えられ、その行列に含まれる「エンドレスポイント(無限ポイント)」の総数を求めることが課題となります。 ある点がエンドレスポイントとみなされるのは、その点自身が1であり、かつ同じ列の下方向・同じ行の右方向にあるすべての要素も1である場合です。すなわち、 mat[i][j] がエンドレスポイントである条件: mat[i][j]、mat[i+1][j] … mat[n-1][j](下方向)および mat[i][j+1] … mat[i][m-1](右方向)がすべて1 具体例で問題を確認しましょう。 入力 mat[][] = { {0, 0}