-
C++でネオン数(Neon Number)を判定する方法
ネオン数とは、ある整数の2乗の各桁の合計が、元の整数と等しくなるような数のことです。具体例を見てみましょう。 n = 92乗 = 812乗の各桁の合計 = 8 + 1 = 9 このように、2乗した値の桁を足し合わせると元の数に戻るため、9はネオン数であると言えます。 本記事では、与えられた数がネオン数かどうかを判定するプログラムをC++で実装します。ネオン数であれば「Yes」を、そうでなければ「No」を出力します。 ネオン数の特徴 10進法においてネオン数は非常に珍しく、現在知られているのは 0、1、9 の3つだけです。これは数学的に証明された性質であり、大きな数になると2乗の桁数が増える一
-
C++でネスビットの不等式を判定する方法
ネスビットの不等式(Nesbitts Inequality)は、正の実数に対して成り立つ有名な数学的不等式の一つです。次のように定義されます。a / (b + c) + b / (c + a) + c / (a + b) ≥ 1.5(ただし a > 0、b > 0、c > 0)この不等式は、相加平均・調和平均の関係やコーシー・シュワルツの不等式などを用いて証明できることでも知られています。本記事では、与えられた3つの数値がこのネスビットの不等式を満たしているかどうかを、C++のプログラムで判定する方法を解説します。アルゴリズム判定の手順は非常にシンプルで、以下の流れで行います
-
C++で実装するニューマン・シャンクス・ウィリアムズ素数の求め方
ニューマン・シャンクス・ウィリアムズ素数(NSW素数)は、数学者ニューマン、シャンクス、ウィリアムズによって研究された特別な数列に現れる素数の系列です。この数列は以下のように始まります。1, 1, 3, 7, 17, 41...このうち素数となる項が「NSW素数」と呼ばれます(例:7, 41, 239 など)。数列の各項を一般化すると、次の漸化式で定義することができます。a0 = 1a1 = 1an = 2 × a(n-1) + a(n-2)アルゴリズム求めたい項の番号 n を初期化します。数列の最初の2項として「1」と「1」を設定します。n の項に達するまでループ処理を行います。直前の2項を
-
C++で入力と同じ順序で「次に大きい要素」を出力する方法
「次に大きい要素(Next Greater Element)」とは、ある要素の後ろに位置する要素の中で、その要素より初めて大きくなる要素のことです。具体例を見てみましょう。arr = [4, 5, 3, 2, 1]この場合、4に対する次に大きい要素は5です。一方、3、2、1の後ろにはそれらより大きい要素が存在しないため、-1が対応します。アルゴリズム配列をランダムな数値で初期化します。スタックと結果格納用の配列を初期化します。配列の末尾から先頭に向かって走査します。スタックが空になるか、スタックの先頭要素が現在の要素以下になるまで、要素を取り除きます(pop)。スタックが空になった場合は、次に
-
C++で「次の大きい要素」を求める方法:スタックを使った効率的なアルゴリズム
「次の大きい要素(Next Greater Element)」とは、配列内のある要素に対して、その後ろに最初に現れるより大きい要素のことです。具体例を見てみましょう。 arr = [4, 5, 3, 2, 1] この場合、4 の次の大きい要素は 5 です。一方、3、2、1 については、後ろにより大きい要素が存在しないため、次の大きい要素は -1 となります。 アルゴリズム 配列をランダムな数値で初期化します。 スタックを初期化します。 配列の最初の要素をスタックにプッシュします。 配列の残りの要素を先頭から順に走査します。 スタックが空であれば、現在の要素をスタックにプッシュして次へ進みま
-
C++でセットビットが1つ多い次に大きい整数を求める方法
問題概要 ある数値 n が与えられたとき、2進表現におけるセットビット(1になっているビット)の数が n より1つ多く、かつ n より大きい数値を見つける必要があります。 なお、2進表現における「1」のビットはセットビットと呼ばれます。 具体例を見てみましょう。 入力 124 出力 125 124 の2進表現は 1111100 で、セットビットは5個です。一方、125 の2進表現は 1111101 で、セットビットは6個あります。つまり 125 は、「124 より大きく、かつセットビットが1つ多い」という条件を満たす整数だというわけです。 アルゴリズム 数値 n を初期化します。 セットビッ
-
【C++】AとBが同数含まれるNより大きい最小の数を求めるアルゴリズム
問題概要N、A、B の 3 つの値が与えられたとき、「数字 A と数字 B が同じ個数だけ含まれる、N 以上の最小の数」を求める問題です。具体例を見てみましょう。N = 1234 A = 2 B = 3この例では、数字 2 と 3 を組み合わせて数を作ります。ただし、それぞれの数字が数の中に現れる回数は等しくなければなりません。この条件を満たす 1234 以上の最小の数は 2233 です(2 が 2 個、3 が 2 個含まれています)。アルゴリズム基本的な考え方は、A と B を使って作れるすべての数を再帰的に生成し、その中から条件を満たす最小の数を見つけるというものです。A、B、N を初期化
-
C++で1回のスワップ操作により次に大きい数を求めるアルゴリズム
ある数 n が与えられたとき、その桁のうち任意の2桁を入れ替える(スワップする)ことで、元の数 n よりも大きい数を作ることを考えます。もし作ることができない場合は -1 を出力します。具体的な例を見てみましょう。入力例:12345出力例:12354この例では、4と5の2桁を入れ替えることで、たった1回のスワップ操作でより大きい数を得ています。アルゴリズムの考え方数の各桁が降順(大きい順)に並んでいる場合、どの2桁を入れ替えてもより大きい数は作れないため、-1 を返します。右側から走査し、末尾の桁よりも小さい値を持つ桁のインデックスを探します。次に、見つかった桁よりも大きく、かつ候補の中で最小
-
C++で同じセットビット数を持つ次に大きい数を求める方法
本記事では、与えられた数値 n より大きく、かつ2進表現におけるセットビット(1のビット)の数が n と同じである数値を求める方法を解説します。2進表現における「1」のビットのことをセットビットと呼びます。具体例まず、以下の入出力例を見てみましょう。入力124出力143124 を2進数で表すと 1111100(セットビット数:5)、143 を2進数で表すと 10001111(セットビット数:5)となり、両者が同じセットビット数を持つことが確認できます。アルゴリズム数値 n を初期化します。セットビットの数をカウントする関数を作成します。反復変数を n + 1 で初期化します。無限ループを作成し
-
C++でn分木の「次に大きい要素」を求めるアルゴリズムと実装
n分木(n-ary tree)とは、各ノードが最大n個の子ノードを持つことができる木構造のことです。本記事では、n分木の中から指定した数値よりも大きい要素のうち最小のもの(いわゆる「次に大きい要素」)を、C++で求める方法を解説します。解法の基本となる考え方はシンプルです。木全体を走査しながら、条件を満たす要素の中で最も小さい値を結果として保持し続けることで、最終的に「次に大きい要素」を確実に取得できます。アルゴリズムn分木を作成する。結果を格納する変数を初期化する。次に大きい要素を取得する関数を実装する。現在のノードがNULLの場合は、その時点で処理を終了して返る。現在のノードの値が、指定し
-
C++で「次に小さい要素」を求める方法|スタックを使った効率的なアルゴリズム
次に小さい要素とは?「次に小さい要素(Next Smaller Element)」とは、ある要素よりも後ろに位置する要素の中で、最初に現れる「より小さい値」のことです。具体例を見てみましょう。arr = [1, 2, 3, 5, 4]この配列では、5 の次に小さい要素は 4 です。一方、1・2・3 の後ろにはそれらより小さい要素が存在しないため、答えは -1 になります。アルゴリズムこの問題はスタックを活用することで効率的に解けます。手順は以下の通りです。配列をランダムな数値で初期化します。スタックを初期化し、最初の要素をプッシュします。配列の各要素を順に走査します。スタックが空の場合は、現在
-
C++でNより大きい最小の素数回文を求めるアルゴリズムと実装
整数 N が与えられたとき、N より大きい最小の素数回文を求めるのがこの記事のテーマです。素数回文(Prime Palindrome)とは、素数であり、かつ回文(前から読んでも後ろから読んでも同じ並びになる数)でもある数のことです。まずは具体例を見てみましょう。 入力 N = 10 出力 11 10 の次の素数は 11 ですが、11 は「1・1」と前後どちらから読んでも同じ数、つまり回文でもあるため、答えは 11 になります。 アルゴリズム 基準となる数値 N を初期化します。 与えられた数が素数かどうかを判定する関数 isPrime を用意します。 与えられた数が回文かどうかを判定する関
-
C++で配列内の最頻出要素を求める方法
配列が与えられたとき、その中で最も多く出現する要素(最頻出要素)を見つける問題を考えてみましょう。まずは具体例から確認します。入力例と出力例入力arr = [1, 2, 3, 3, 2, 2, 1, 1, 2, 3, 4]出力2上記の配列では、2 が4回出現しており、他のどの要素よりも出現回数が多くなっています。アルゴリズム1:ハッシュマップを使う方法配列を初期化します。各要素の出現回数を格納するためのマップ(unordered_map)を初期化します。配列を走査しながら各要素の出現回数を数え、マップに保存します。マップを走査し、最も出現回数の多い要素を見つけます。その要素を返します。この方法
-
C++でモツキン数の第n項を計算する方法
モツキン数とは モツキン数(Motzkin number)は、組合せ論で登場する有名な整数列の一つで、1, 1, 4, 9, 21, 51, ... と続きます。円周上に並べた n 個の点の間に互いに交差しない弦を引く方法の総数など、さまざまな組合せの問題を表すことで知られています。 モツキン数の一般項は、直前の2項を用いた次の漸化式によって求められます。 a0 = 1 a1 = 1 a2 = 4 a3 = 9 an = ((2n + 1) / (n + 2)) × M(n−1) + ((3n − 3) / (n + 2)) × M(n−2) アルゴリズム 求めたい項の番号 n を初期化しま
-
C++で配列内のすべてのゼロを末尾に移動する方法
複数のゼロ(0)を含む配列が与えられたとき、すべてのゼロを配列の末尾に移動させる必要があります。それ以外の要素は元の順序を保ったまま前に詰めます。具体例を見てみましょう。入力arr = [4, 5, 0, 3, 2, 0, 0, 0, 5, 0, 1]出力4 5 3 2 5 1 0 0 0 0 0アルゴリズム配列を初期化します。書き込み位置を示すインデックス変数を 0 で初期化します。与えられた配列を先頭から順に走査します。現在の要素がゼロでない場合、その値をインデックスの位置に書き込みます。その後、インデックスを1つ進めます。上記の処理が終わったインデックスから配列の長さ n まで繰り返すル
-
C++で配列内の0を先頭へ、1を末尾へ移動する方法を解説
このチュートリアルでは、配列内のすべての0を先頭に移動し、すべての1を末尾に移動するプログラムをC++で作成する方法を解説します。問題として、0と1がランダムな整数と混在した配列が与えられます。この配列に対して、すべての0を配列の先頭へ、すべての1を配列の末尾へ移動させる必要があります。まずは具体例を見てみましょう。入力arr = [4, 5, 1, 1, 0, 0, 2, 0, 3, 1, 0, 1]出力0 0 0 0 4 5 2 3 1 1 1 1アルゴリズム配列を初期化します。インデックス変数を0で初期化します。与えられた配列を先頭から順に走査します。現在の要素が1でない場合、その値を現
-
C++で連結リスト内のすべての0を先頭に移動する方法
問題の概要ランダムな整数と0を含む連結リストが与えられます。この問題では、リスト内のすべての0を連結リストの先頭に移動させる必要があります。具体的な例を見てみましょう。入力3 -> 0 -> 1 -> 0 -> 0 -> 1 -> 0 -> 0 -> 3 -> NULL出力0->0->0->0->0->3->1->1->3->NULL出力を見ると、すべての0がリストの先頭に集められ、それ以外の要素は元の相対的な順序を保ったまま後ろに並んでいることがわかります。アルゴリズム連結リストを初期
-
C++で連結リストの先頭要素を末尾へ移動する方法を解説
はじめに連結リスト(Linked List)が与えられたとき、先頭の要素を末尾へ移動する操作を行います。この操作は、ポインタの付け替えだけで実現できる連結リストの基本的なテクニックの一つです。まずは具体例を見てみましょう。入力例1 -> 2 -> 3 -> 4 -> 5 -> NULL出力例2 -> 3 -> 4 -> 5 -> 1 -> NULLアルゴリズム先頭ノードを末尾へ移動するには、以下の手順に従います。連結リストを初期化します。連結リストが空、またはノードが1つしかない場合は、何もせずに処理を終了します。連結リストの末尾ノー
-
C++で連結リストの最後の要素を先頭に移動する方法
連結リストが与えられたとき、最後の要素を先頭(ヘッド)へ移動させる必要があります。まず、具体的な例を見てみましょう。入力1 -> 2 -> 3 -> 4 -> 5 -> NULL出力5 -> 1 -> 2 -> 3 -> 4 -> NULLアルゴリズム連結リストを初期化します。連結リストが空であるか、ノードが1つしかない場合は、そのまま処理を終了して返します。連結リストの最後のノードと、後ろから2番目のノードを探します。最後のノードを新しいヘッド(先頭)として設定します。後ろから2番目のノードのリンク(nextポインタ)を更新します。
-
C++で%演算子を使わずに3と5の倍数を判定する方法
通常、ある数が3や5の倍数であるかどうかを調べるには、% 演算子(剰余演算子)を使えば簡単に実装できます。しかし、この問題では % 演算子を使用することが禁止されています。そこで本記事では、+ 演算子(加算)を活用するアプローチを紹介します。考え方はシンプルで、「前の倍数に3または5を足せば次の倍数になる」という性質を利用します。まずは具体例を見てみましょう。入力例と出力例入力15出力1 2 3 - Multiple of 3 4 5 - Multiple of 5 6 - Multiple of 3 7 8 9 - Multiple of 3 10 - Multiple of 5 11 12