-
C++でプレフィックス式(前置記法)を評価する方法
この記事では、プレフィックス式(前置記法)の評価方法について詳しく解説します。プレフィックス式とはプレフィックス記法では、演算子がオペランドの前に置かれるのが特徴です。つまり、演算子がオペランドよりも先に書かれます。例えば「+ab」は、中置記法の「a + b」と同じ意味を持ちます。プレフィックス記法は「ポーランド記法」とも呼ばれています。例:* + 6 9 - 3 1プレフィックス式は中置式よりも高速に評価できるという利点があります。また、括弧が一切不要なため、評価処理をより素早く行うことができます。プレフィックス式を評価するアルゴリズムプレフィックス式の評価にはスタックというデータ構造を使用
-
C++で式ツリー(Expression Tree)を評価する方法|再帰を使った実装例
本記事では、+、-、*、/ といった二項演算子から構成される式ツリー(Expression Tree)を評価し、その計算結果を返す問題について解説します。 式ツリーとは 式ツリーは二分木の一種であり、各ノードには演算子またはオペランド(被演算数)が格納されます。ノードの役割は次のように分けられます。 葉ノード:演算の対象となる値(オペランド)を保持します。 非葉ノード(内部ノード):実行すべき演算を表す二項演算子を保持します。 式ツリーを中順走査(in-order traversal)すると、元の中置記法の数式が復元できるのが特徴です。 例題で理解しよう 入力:次のような式ツリーが与えられ
-
C++で実装する投資リスクの評価:標準偏差と平均値による有望な投資先の判定
本記事では、2つの配列で表された投資プランを比較し、どちらの投資がより有望かを統計的手法を用いて評価する問題を扱います。C++による実装例とともに、投資リスク評価の基本的な考え方を解説します。 問題の概要 2つの投資案 I1[][] と I2[][] が与えられます。それぞれの投資には、複数の「結果(アウトカム)」と、その結果が発生する「確率」がペアとして含まれています。 これらの値をもとに各投資のリスクを算出し、より有望な投資案を出力するのが目的です。この判断には統計数学の知識を活用します。 評価に用いる指標 リスク評価のために、以下の2つの統計量を計算します。 期待値(平均額
-
C++におけるオペランドの評価順序をサンプルコードで解説
プログラミング言語には、演算がどのように実行されるかを定めるルールがいくつか存在します。代表的なものとして、「演算の優先順位」「結合規則」「評価順序」が挙げられます。 結合規則とは、同じ優先順位を持つ演算子が並んだときに、左から右へ処理するのか、右から左へ処理するのかを決める規則のことです。C++の多くの二項演算子(算術演算子など)は、左から右への結合規則を持つと定義されています。 一方で注意が必要なのがオペランドの評価順序です。C++では、演算子の左右どちらのオペランドが先に評価されるかは保証されていません(未規定)。そのため、副作用を伴う関数呼び出しを一つの式に複数含めると、挙動に注意が必
-
C++で偶数を偶数インデックスへ、奇数を奇数インデックスへ並べ替える方法
この問題では、サイズnの配列arr[]が与えられます。配列は半分(n/2個)が偶数、残り半分(n/2個)が奇数で構成されており、偶数を偶数インデックス(0, 2, 4…)に、奇数を奇数インデックス(1, 3, 5…)に配置するプログラムを作成することが課題です。 問題を理解するための例 入力: arr[] = {5, 1, 6, 4, 3, 8} 出力: arr[] = {6, 1, 5, 4, 3, 8} 解決アプローチ まず思いつくのは、配列を走査しながら「偶数位置にない値」を見つけ、次の奇数位置の値と入れ替えていく方法です。これは有効な解法ですが、偶数用と奇数用の2つのインデックスを使う
-
C++でn分木の偶数サイズの部分木を数える方法
問題の概要 この問題では、n分木(n-ary tree)の構造を表す隣接リストが与えられ、その木に含まれる偶数サイズの部分木の個数を求めることが課題となります。 n分木とは、一般的に次のような階層構造で表現されるノードの集合として定義されます。 木はルートノードから始まる。 各ノードは、子ノードへのポインタのリストを保持する。 各ノードが持てる子ノードの数はm以下である。 具体例で問題を理解する 入力: ノード7を根とする木(7の子は2と9、2の子は0と1、9の子は3、3の子は8、0の子は5) 出力: 4 説明: ノード7を根とする部分木のサイズは8(偶数)→ カウント ノード2を根とす
-
C++で2つの整数を使う偶奇ターンゲームの解き方
この問題では、3つの整数 A、B、T が与えられます。私たちのタスクは、2つの整数を使った偶奇ターンゲームをシミュレートするプログラムを C++ で作成することです。 ゲームのルール 各整数の意味は次の通りです。 T: ゲームのターン数 A: プレイヤー1の値 B: プレイヤー2の値 ターンごとに以下の操作が行われます。 T が奇数のとき:A の値が2倍される T が偶数のとき:B の値が2倍される そして、すべてのターンが終わった時点の max(A, B) / min(A, B) の値を求めて返します。 例で問題を理解しよう 入力: A = 3, B = 4, T = 3 出力: 1
-
C++でイビルナンバー(悪数)とオディアスナンバーを判定する方法
イビルナンバーとオディアスナンバーとは? この問題では、整数 N が与えられ、その数がイビルナンバー(Evil Number)かオディアスナンバー(Odious Number)かを判定します。 イビルナンバー:2進表現における「1」の個数が偶数である正の整数のことです。 例:5、17 オディアスナンバー:2進表現における「1」の個数が奇数である正の整数のことです。 例:4、6 具体例で問題を理解しよう 入力:N = 65 出力:イビルナンバー 解説: 65 の2進表現は 1000001 です。「1」が2つ含まれており、その個数は偶数なので、65 はイビルナンバーであると判定できます。 解法のア
-
C++で奇数を素数の和として表現する方法|ゴールドバッハ予想を活用したアルゴリズム
この問題では、ある奇数Nが与えられます。求められているのは、その奇数を素数の和として表現することです。 ただし、表現に使用できる素数は最大で3つまでという制約があります。 問題を理解するための具体例 入力: N = 55 出力: 53 + 2 解法アプローチ 奇数は素数の和として表現できます。使用する素数の個数に着目すると、この問題は次の3つのケースに分けて考えることができます。 ケース1: n自体が素数である場合 → 1つの素数 n のみで表現できます。ケース2: (n − 2) が素数である場合 → 2つの素数 2 と (n − 2) の和として表現できます。 ケース3: 上記のいずれに
-
C++で学ぶ式ツリー(Expression Tree)の基本と具体例
式ツリーとは何か式ツリー(Expression Tree)とは、二分木の一種であり、木の各ノードが「演算子」または「オペランド(被演算子)」のいずれかで構成される特殊なデータ構造です。数式を木構造として表現することで、コンパイラや電卓アプリなどが数式を効率的に解析・評価できるようになります。ノードの役割式ツリーにおける各ノードは、次のように役割が分かれています。葉ノード(リーフノード):オペランド(数値や変数)を表します。非葉ノード(内部ノード):演算子(+、-、*、/ など)を表します。つまり、計算の対象となる値は必ず葉に配置され、それらをどのように処理するかを示す演算子が親ノードとして上に
-
C++で実装する拡張ミディの定理(Extended Midy's Theorem)
拡張ミディの定理とはミディの定理(Midys Theorem)は、分数 n/p の小数展開に関する定理です。ここで n は任意の整数、p は素数であり、n/p が偶数桁の循環小数になるとき、循環節を半分に分割してその2つの数を足し合わせると、必ず 999…9(すべて9が並んだ数)になります。この考え方を一般化したものが拡張ミディの定理(Extended Midys Theorem)です。循環節を m 桁ずつのブロックに分割したとき、それらの総和は 10m − 1 の倍数になる、というものです。例えば 1/17 = 0.0588235294117647 の場合、循環節「0588235294117
-
関係代数の拡張演算子とは?交差・結合・除算の基礎をわかりやすく解説
関係代数の拡張演算子とは関係データモデルは、世界中でデータの保存や処理に広く利用されている最も基本的なデータモデルです。このモデルはシンプルでありながら、記憶効率の高いデータ処理に必要な特性と機能をすべて備えています。関係代数には基本演算子が定義されていますが、本記事ではその中でも特に重要な拡張演算子について解説します。拡張演算子は主に次の3種類に分類されます。交差(Intersection)結合(Join)除算(Divide)交差演算(Intersection)交差演算は、2つの関係R1とR2に対して適用される特殊な演算です。R1とR2の両方に存在するタプルのみを含む新しい関係を結果として返
-
C++で学ぶ外部ソート(External Sorting)の仕組みと実装例
外部ソート(External Sorting)とは 外部ソートは、膨大な量のデータを扱えるカテゴリのソートアルゴリズムです。この手法は、メインメモリ(RAM)には収まりきらず、補助記憶装置(ハードディスク)上に保存されているような、大きなメモリを必要とするデータセットのソートに適用されます。 外部ソートの基本的な考え方 外部ソートで用いられるソートの考え方は、マージソート(merge sort)と非常に似ています。マージソートと同様に、次の2つのフェーズで構成されます。 ソートフェーズ:メモリに収まるサイズの小さなデータセットをそれぞれソートします。 マージフェーズ:ソート済みの小さなデー
-
C++で除算を使わずに2つの数値の平均を高速に求める方法
この記事では、2つの数値 A と B が与えられたとき、除算(割り算)を使わずに平均値を高速に計算するプログラムを C++ で実装する方法を解説します。問題の例入力: A = 34、B = 54出力: 44解法のアプローチ通常、2つの数値の平均は「合計を2で割る」ことで求めます。つまり (A + B) / 2 という式になります。しかし、この問題では除算演算子を使用せずに平均を求める必要があります。そこで活躍するのが右シフト演算子 >> です。数値を1ビット右にシフトすると、2で割った結果と同じ値になります。これは、2進数表現において右シフトが桁を1つ下げる操作に相当するためです。
-
C++で実装する高速逆平方根(Fast Inverse Square Root)アルゴリズムの解説
この問題では、整数 x が与えられ、それを32ビット浮動小数点数として扱い、高速逆平方根(Fast Inverse Square Root、すなわち 1/√x)を計算することを目的とします。 逆平方根を求めるこのアルゴリズムは、3Dグラフィックスにおけるベクトルの正規化など、特にコンピュータゲームのプログラミングにおいて絶大な効果を発揮する手法として知られています。名作FPS『Quake III Arena』のソースコードに採用されていたことから、「Quake IIIのアルゴリズム」としても広く知られています。 アルゴリズムの手順 ステップ1:浮動小数点値を、同じビットパターンを持つ整数値と
-
C++で扱う連合データベース管理システム(FDBMS)の主な課題
連合データベース管理システム(FDBMS)とはデータベース管理システム(DBMS)とは、ユーザーのデータを適切なセキュリティ対策を講じながら、最大限の効率で保存・取得するための技術を指します。その中でも連合データベース管理システム(Federated Database Management System)は特殊なタイプのDBMSです。複数の自律的なデータベースを透過的にマッピングし、あたかも1つのデータベース(連合データベース)であるかのように扱うことを可能にします。連合データベース管理システムは、複数のアプリケーションがデータベースの連合(フェデレーション)を利用して動作するような環境におい
-
C++でフェルマーの最終定理を検証するプログラムの作り方
数論におけるフェルマーの最終定理(別名:フェルマーの予想)とは、「2より大きい整数 n に対して、次の等式を満たす3つの正の整数 a, b, c は存在しない」と主張する有名な定理です。 an + bn = cn つまり、次のように整理できます。 n ≤ 2 の場合:an + bn = cn を満たす組み合わせが存在します。 n ≥ 3 の場合:an + bn ≠ cn となり、そのような組み合わせは一切存在しません。 n = 2 の具体例(ピタゴラス数) 3, 4, 5 ⇒ 32 + 42 = 9 + 16 = 25 = 52 5, 12, 13 ⇒ 52 + 122 = 25 + 1
-
C++でフェルマーの小定理を検証する方法
フェルマーの小定理とは フェルマーの小定理とは、p を素数としたとき、任意の整数 a に対して「ap − a が p の倍数になる」という定理です。 これを剰余演算(mod)で表現すると、次のようになります。 ap ≡ a (mod p) さらに、a が p で割り切れない場合(a と p が互いに素である場合)は、両辺を a で割ることで次の形に変形できます。 ap−1 ≡ 1 (mod p) この記事で扱う問題 ここでは、2つの整数 a と p が与えられ、これらの値に対してフェルマーの小定理が実際に成り立つかどうかを検証します。具体的には、次のいずれかの式が成立するかを確認します。
-
C++で数値の5乗根の床値を求める方法【線形探索と二分探索】
この問題では、数値 N が与えられ、その5乗根の床値(小数点以下を切り捨てた整数値)を求めることが課題となります。ある数の5乗根とは、その数自身を5回掛け合わせると元の数になる値のことです。つまり、N1/5 = a であるとき、a × a × a × a × a = N が成り立ちます。例で問題を理解しよう入力:N = 325出力:3説明:325 の5乗根は約 3.179 であり、その床値は 3 になります。解法アプローチ1:線形探索最もシンプルな解決策は、1 から n まで順番に走査し、自分自身を5回掛けると n になる(または n を超える直前の)数を見つける方法です。ただし、与えられる数
-
Linuxのファイルグロブとは?ワイルドカードによるパス名展開を徹底解説
ファイルグロブ(パス名展開)とは ファイルグロブ(File Globbing)は「パス名展開(Path Name Expansion)」とも呼ばれる仕組みで、Linuxにおいてワイルドカードのパターンを認識し、そのパターンに基づいてファイルパスを展開することで、条件に合致するファイルを見つける方法です。 ワイルドカードパターンとは ワイルドカードパターンとは、パターンをもとに複数のファイルを選択するために用いられる特殊な文字列のことです。「*」「?」「[]」といった文字を使用することで、柔軟なパターンマッチングやファイルの一括選択が可能になります。 アスタリスク(*):0文字以上の任意の文