-
【C++】配列内の「残りの要素の合計と等しい要素」を見つける方法
この記事では、n個の正の整数からなる配列 arr[] が与えられたとき、その中から「残りのすべての要素の合計と等しい要素」を見つけるアルゴリズムを解説します。問題の概要:配列内の要素のうち、その要素自身を除いた他のすべての要素の合計と値が一致するものを見つける必要があります。例で問題を理解しよう入力:arr[] = { 5, 4, 17, 1, 7 }出力:17説明:残りの要素の合計は (5 + 4 + 1 + 7) = 17 となり、これは要素 17 と一致します。したがって答えは 17 です。解法のアプローチこの問題には、非常にシンプルで効率的な解法があります。それは「配列の全要素の合計は
-
C++で配列内の前後の要素よりも大きい要素を見つける方法
問題概要この問題では、n個の正の整数からなる配列 arr[] が与えられます。求めるのは、配列の中で「直前の要素と直後の要素のどちらよりも大きい」要素を見つけることです。条件の説明具体的には、ある要素 arr[i] が次の2つの条件を同時に満たすかどうかを判定します。arr[i] > arr[i-1](1つ前の要素より大きい)arr[i] > arr[i+1](1つ後の要素より大きい)この両方を満たす要素をすべて出力すればよいわけです。入出力例で問題を理解する入力: arr[] = {3, 2, 5, 7, 3, 4, 5}出力: 7説明:要素 7 に注目すると、1つ前の要素は 5
-
C++で別の配列のどの要素でも割り切れない配列の要素を見つける方法
この問題では、2つの整数型配列 arr1[] と arr2[] が与えられます。私たちのタスクは、「arr2 のどの要素によっても割り切れない arr1 の要素」をすべて見つけるプログラムを作成することです。 問題の説明 arr1 に含まれる各要素について、arr2 のいずれかの要素で割り切れるかどうかを判定し、割り切れない要素だけを出力します。 入出力例で理解しよう 入力: arr1[] = {17, 15, 5, 12, 8} / arr2[] = {5, 4} 出力: 17 解説: 17 → arr2 のどの要素でも割り切れない(条件を満たす) 15 → 5 で割り切れる 5 → 5
-
配列の範囲を完成させるために追加が必要な要素数を求めるC++プログラム
この問題では、n個の整数からなる配列arr[]が与えられます。私たちのタスクは、配列の最小値から最大値までの範囲に含まれるすべての要素が揃うようにするために、追加が必要な要素の数を求めるプログラムを作成することです。 問題の概要 ここで求めたいのは、配列に含まれる最小値から最大値までの連続した範囲を完成させるために、あといくつの要素を追加すればよいかという数です。 入出力例で問題を理解しよう 入力: arr[] = {5, 8, 3, 1, 6, 2} 出力: 2 解説: 配列の最小値は1、最大値は8なので、揃えるべき範囲は「1〜8」となります。 この範囲の中で配列に存在しないのは4と7の2
-
C++で学ぶEloレーティングアルゴリズムの仕組みと実装方法
Eloレーティングアルゴリズムは、チェスやeスポーツなどの対戦型競技においてプレイヤーをランク付けするために広く使われているレーティング手法です。プレイヤーのレーティングは、試合ごとのパフォーマンス(勝敗)に応じて変動します。 レーティング移動の基本的な考え方 ここでは、異なるレーティングを持つ2人のプレイヤーが対戦するケースを考えます。 Player1 vs Player2 前提として、Player1のレーティングがPlayer2より高いとします。 試合に勝敗がつくと、一定のポイントが敗者から勝者へ移動します。しかし、その移動量は固定ではなく、どちらのプレイヤーが勝ったかによって変わるのが特
-
【C++入門】エマープ数(Emirp)とは?n以下のエマープ数をすべて出力するプログラム
エマープ数(Emirp number)とは、素数の一種で、その桁を逆順に並べ替えると別の素数になる数のことです。ここでいう「別の素数」とは、元の数と同じ値にならないものを指します。 Emirpは「prime(素数)」を逆から読んだ言葉 すべての素数がエマープ数になるわけではありません。たとえば、回文素数(121のように逆から読んでも同じ数になる素数)や、1桁の素数(2、3、5、7)は、桁を逆にしても同じ数または意味を持たないため、エマープ数には含まれません。 エマープ数の例:13、17、37、733 などがあります。 13 を逆にすると 31(素数)→ エマープ数 17 を逆にすると 71
-
C++で1次元配列を使って2次元配列をエミュレートする方法|行優先・列優先のインデックス変換を解説
はじめに本記事では、2次元配列を1次元配列へ変換する方法について解説します。2次元配列の各要素を、どのように1次元配列へ格納すればよいのかを具体的に見ていきましょう。ここで用意する1次元配列のサイズは、2次元配列の全要素数である「n × m」と同じになります。プログラミングにおいて、2次元配列を1次元配列へ格納する方式は主に次の2つがあります。行優先(Row Major)列優先(Column Major)行優先(Row Major)とは行優先方式では、まず1行目の要素をすべて順番に格納し、その後に次の行へ移動していきます。C++をはじめ、CやPythonなど多くの言語では、この行優先が標準的な
-
C++のエンディアン(バイト順序)とバイナリファイルの基本
エンディアンとは?バイナリファイルやデータ管理において、エンディアン(endianness)とは、デジタルデータをコンピュータのメモリ上に格納する際のバイトの並び順を指します。同じ数値データでも、バイトをどの順番で並べるかによって、メモリ上での表現が異なります。コンピュータのメモリには、主に以下の2種類のエンディアン方式が存在します。ビッグエンディアン(Big-endian)ビッグエンディアン方式は、データの最上位バイト(最も大きい桁に相当するバイト)から順にメモリへ格納します。リトルエンディアン(Little-endian)リトルエンディアン方式は、データの最下位バイト(最も小さい桁に相当す
-
C++でエントリンガー数を求める方法
エントリンガー数(Entringer Number)とは、{1, 2, 3, …, n+1} の順列のうち、K+1 で始まり、値が「減少 → 増加」を交互に繰り返すように並べられた順列の個数に等しい特殊な数です。 エントリンガー数は、次の漸化式を用いて求めることができます。 E(n, k) = E(n, k-1) + E(n-1, n-k) 基本値(ベースケース)は以下のとおりです。 E(0, 0) = 1 E(n, 0) = 0 具体例で値を確認してみよう n = 5、k = 3 の場合を考えてみます。 E(5, 3) = 14 となります。 解法の動作を示すプログラム 例 #includ
-
C++で二分木を列挙する:ラベル付き・ラベルなしの総数の求め方
二分木の列挙(Enumeration of Binary Tree)とは、指定されたノード数(サイズ)をもつ「相異なる二分木」が全部で何通り存在するかを数える問題です。本記事では、n 個のノードから構成される二分木の総数を求めるプログラムをC++で作成します。 ラベルの有無による2つの分類 二分木は、ノードへのラベル付けの有無によって次の2種類に分けられます。 ラベル付き二分木(Labeled Binary Tree) ラベルなし二分木(Unlabeled Binary Tree) ラベル付き二分木 ラベル付き二分木とは、木を構成する各ノードに値(ラベル)が割り当てられた二分木のことです
-
C++で図形の周の長さと面積が等しいか(Equable Shape)を判定する方法
この問題では、多角形の各頂点の座標が与えられます。私たちの課題は、与えられた多角形が「イコーエーブルシェイプ(Equable Shape:等価図形)」であるかどうかを判定するプログラムを作成することです。 Equable Shape(等価図形)とは、図形の周囲の長さ(外周)と面積がちょうど等しくなる図形のことを指します。 問題を理解するための例 入力: polygon[][] = {{0, 0}, {5, 7}, {2, 0}} 出力: 等価図形ではない(Not equable) 説明: 周囲の長さ = 18.21面積 = 7 解決アプローチ この問題の解き方は非常にシンプルです。まず図形の
-
C++で和とXORが等しくなる整数の個数を求めるアルゴリズム
問題概要 この問題では、整数 n が与えられます。i = 0 から n までの範囲において、加算結果とXOR(排他的論理和)の結果が一致する、すなわち (n + i) = (n ^ i) を満たす整数 i の個数を求めるプログラムを作成します。 入出力例 入力: n = 4 出力: 4 説明: i = 0 から n までのすべての値を確認すると、次のようになります。 in + in ^ i一致するか 04 + 0 = 44 ^ 0 = 4○ 14 + 1 = 54 ^ 1 = 5○ 24 + 2 = 64 ^ 2 = 6○ 34 + 3 = 74 ^ 3 = 7○ 44 + 4 = 84
-
C++で配列要素の移動だけで配列を均等化するために必要な操作回数を求める方法
この記事では、n個の要素を持つ配列が与えられたとき、配列内の要素同士で値を受け渡すことによってすべての要素を同じ値に揃える(均等化する)ために必要な操作回数を求めるC++プログラムを紹介します。 ここでいう「1回の操作」とは、ある要素から値を1だけ引き、その分を別の要素へ1だけ加えることを指します。つまり減算と加算を合わせて1セットとしてカウントします。重要なのは、値の受け渡しによって配列全体の合計は常に変わらないという点です。 問題例 入力: arr[] = {4, 0, 3, 1, 2} 出力: 3 説明: 最終的にすべての要素が揃う値は「2」です。 arr[0] の値 4 から 2 を
-
C++で等デジタル数を判定・列挙する方法を解説
等デジタル数(Equidigital Number)とは? 等デジタル数とは、その数自身の桁数と、素因数分解で表したときの桁数が一致するという、数学的に特別な性質を持つ数のことです。 例えば 10 を見てみましょう。10 の素因数分解は 2 × 5 であり、これを並べた「25」は 2 桁です。元の数 10 も 2 桁であるため、10 は等デジタル数に該当します。 本記事では、整数 n が与えられたときに、n 未満のすべての等デジタル数を求める C++ プログラムの作り方を解説します。 問題の例 入力: n = 12 出力: 1 2 3 5 7 10 11 代表的な数の判定例 数素因数分解分
-
C++で配列の平衡インデックスを求める方法を解説
問題の概要この記事では、n個の整数値を含む配列 arr[] が与えられたとき、その平衡インデックス(equilibrium index)を見つけるプログラムをC++で作成する方法を解説します。平衡インデックスとは、その位置より前にあるすべての要素の合計と、後ろにあるすべての要素の合計が等しくなるインデックスのことです。サイズ n の配列 arr[] において、平衡インデックス e は次の条件を満たします。sum(arr[0 … e-1]) = sum(arr[e+1 … n-1])具体例で理解しよう入力:arr[] = {5, 1, 2, 8, 3, 4, 1}出力:3説明:インデックス3の要
-
C++で微分方程式を数値的に解く!オイラー法の基本と実装方法
本記事では、初期値 y(x0) = y0 を持つ微分方程式 f(x, y) = dy/dx が与えられたとき、その解をオイラー法(Euler Method)を用いて求める方法を解説します。C++による実装例もあわせて紹介します。 オイラー法とは オイラー法は「前進オイラー法(Forward Euler Method)」とも呼ばれる手法で、微分方程式の解を初期値をもとに近似的に求めるための一次精度の数値計算法です。解析的に解けない複雑な微分方程式でも、コンピュータを使えば数値的に近似解を得られるのが大きな魅力です。 微分方程式 f(x, y) = dy / dx に対して、オイラー法は次のように
-
C++で学ぶオイラーの四平方恒等式――2数の積を4つの平方数の和で表す方法
問題の概要 本記事では、2つの数値が与えられたとき、オイラーの四平方恒等式(Eulers Four-Square Identity)を利用して両者の積を求める方法を解説します。 オイラーの四平方恒等式とは、「2つの整数がそれぞれ4つの平方数の和として表せるならば、その積もまた4つの平方数の和として表せる」という有名な定理です。つまり、次の関係が成り立ちます。 a = x12 + x22 + x32 + x42 b = y12 + y22 + y32 + y42 a × b = z12 + z22 + z32 + z42 具体例で理解しよう 入力: a = 54 = 2×2 + 3×3 + 4
-
C++でオイラー数を求める:再帰による実装と解説
オイラー数とは 数学においてオイラー数(Eulerian number)は、特殊な組合せ数の一種です。1からnまでの数を並べた順列のうち、「隣接する2つの要素を比較したとき、前の要素より後の要素が大きくなる箇所(昇順)がちょうどm個ある」ような順列の個数を表します。 オイラー数は一般に A(n, m) と表記されます。 問題の定義 この問題では、2つの整数 n と m が与えられます。求めたいのは、条件を満たす順列の個数、すなわちオイラー数 A(n, m) の値です。 例で問題を理解しよう 入力: n = 4、m = 2 出力: 11 解説: 1から4までの数の順列は、全部で以下の24通りあり
-
C++で文字列として表現されたブール式を評価する方法
問題の概要 この記事では、ブール式(論理式)を表す文字列 exp が与えられたとき、その式を評価して結果を求める方法を解説します。 式には次の文字が使用されます。 0 / 1:ブール値(偽・真) &:AND(論理積)演算 |:OR(論理和)演算 ^:XOR(排他的論理和)演算 与えられた式を計算し、その結果を返すことがゴールです。 問題を理解するための例 入力:str = 1&1|0^1^0&1 出力:0 説明:式は左から順に次のように評価されます。 1&1|0^1^0&1→ 1 AND 1 OR 0 XOR 1 XOR 0 AND 1→ 1 OR
-
C++で数値と「+」「-」演算子のみを含む配列式を評価する方法
この記事では、n個の文字列要素からなる配列 arr[] で表現された数式を評価する方法を解説します。配列の各要素は、数値、または演算子「+」「-」のいずれかであり、これらを順に処理して最終的な計算結果を求めるのが課題です。問題の概要与えられる式には、数値・「+」記号・「-」記号のみが含まれます。括弧や乗除算は考慮せず、左から順に加減算を適用していきます。入力例arr = {5, +, 2, -, 8, +, 9}出力例8解説この式は 5 + 2 - 8 + 9 = 8 として評価されます。解法アプローチ解き方はシンプルです。配列を先頭から順に走査し、各演算子に応じて加算または減算を実行します。