-
C++の配列における偶数インデックスと奇数インデックス要素の絶対差を求める方法
配列と絶対差とは 配列(Array)とは、同じデータ型の複数の要素をまとめて格納できるコンテナです。要素のインデックスは0から始まり、最初の要素がインデックス0に対応します。 本記事では、偶数インデックスの要素同士、および奇数インデックスの要素同士の絶対差を求める方法を解説します。 偶数インデックス:0, 2, 4, 6, 8 … 奇数インデックス:1, 3, 5, 7, 9 … 絶対差とは、2つの値の差の絶対値(|a − b|)のことです。たとえば、15と7の絶対差は |15 − 7| = 8 となります。 問題の例 入力:arr = {1, 2, 4, 5, 8} 出力: 偶数インデ
-
C++で指定された角度から弧の長さを求める方法
角(かく)とは、2本の半直線が1点で交わることで形成される図形です。この半直線が交わる平面上の点を頂点と呼びます。円の弧(こ)とは、ある角度によって表される円周の一部のことです。この記事では、円の角度が与えられたとき、直径の値を使ってその弧の長さを求める方法を解説します。問題の例入力: 角度 = 45° 直径 = 28 出力: 弧の長さ = 11解説弧の長さは、次の式で求めることができます。弧の長さ = (円周)×(角度 ÷ 360°)=(π × 直径)×(角度 ÷ 360°)与えられた角度と直径から弧の長さを計算するプログラムを作成するには、この公式を適用します。なお、角度が360°以上の場
-
C++で実装する二分木の反時計回りスパイラル走査:アルゴリズムとサンプルコードを解説
二分木の反時計回りスパイラル走査(Anti-Clockwise Spiral Traversal)とは、木のノードを渦巻き状に、かつ通常とは逆向きの順序でたどっていく走査方法です。根(トップのノード)から開始し、レベル(深さ)ごとに左右の方向を交互に切り替えながら、木の外側から内側へと渦を描くようにノードを出力していきます。 下図は、二分木を反時計回りにスパイラル走査した際の訪問順序を示したものです。 アルゴリズムの流れ 二分木をスパイラル走査するためのアルゴリズムは、次の手順で動作します。 2つの変数 i と j を用意し、i は最上位レベル「1」、j は木の高さでそれぞれ初期化します。
-
C++でソート済み配列の絶対値における異なる要素数を数える方法
配列(Array)とは、同じデータ型の要素を集めたデータ構造のことです。ソート済み配列とは、要素が昇順または降順に並べられた配列を指します。異なる要素数(distinct count)とは、配列内に重複して存在しない要素の数のことです。絶対値の異なる要素数(absolute distinct count)とは、各要素の絶対値(符号を無視した値)に着目したときの、異なる要素の数を意味します。この記事では、ソート済み配列における絶対値の異なる要素数を求めるプログラムを紹介します。つまり、配列の各要素の絶対値を考えた場合に、何種類の値が存在するかをカウントします。例を見てみましょう。入力 : [-3
-
C++ STLのbasic_string::c_str関数とは?使い方を解説
C++のSTL(Standard Template Library)に含まれるbasic_stringクラスには、文字列を扱うための便利なメンバ関数が多数用意されています。その中でもc_str()は、NULL終端された文字配列へのポインタを返す重要な関数です。c_str関数とはc_str()は、C++のSTLライブラリに組み込まれているメソッドで、NULL文字(\0)で終端された文字配列へのポインタを返します。これにより、std::string型の文字列を、C言語スタイルの文字列として扱うことが可能になります。C言語の関数や、const char* 型の引数を受け取るAPIと連携する際に頻繁に
-
C++のset(集合)にユーザー定義型を指定する方法
set(セット)は値を格納するためのデータ構造です。setの最大の特徴は、要素が互いに重複しないこと(同じ値を持つ要素が複数存在しないこと)、そして値が自動的に昇順でソートされて保持される点にあります。C++では、setに格納するデータ型を明示的に定義することが可能で、intやstringといった組み込み型だけでなく、ユーザー定義型(構造体やクラス)を指定することもできます。 データを重複なく、かつソートされた状態で保持したい場合にsetは非常に便利です。たとえば次のような動作になります。 Input : 124689781230 Output : 012346789 ロジック setへの入
-
C++で実装するAngular Sweep(角度スイープ)アルゴリズムの解説
本記事では、与えられた半径の円に含めることができる点の最大数を求めるアルゴリズムについて解説します。具体的には、半径 r の円と2次元平面上の点の集合が与えられたとき、その円の内部(円周上は除く)に収まる点の数の最大値を見つけるという問題です。この問題を効率的に解くための最も有効な手法が「Angular Sweep(角度スイープ)アルゴリズム」です。アルゴリズムの基本的な考え方各点 P を基準としたとき、半径 r の円が別の点 Q を覆える角度の範囲は「区間」として表現できます。点 Q が P から距離 2r 以内にあれば、P の周りで円を回転させる際に Q が円内に入る角度範囲 [α, β]
-
C++のbitset(ビットセット)に関する興味深い事実
C++の標準テンプレートライブラリ(STL)には、bitsetというコンテナが定義されています。bitsetは、変数の各ビット(0と1)単位で直接操作を行うためのコンテナで、値をバイナリ表現として扱いたい場面で活躍します。ここでは、bitsetについて知っておくと便利な特徴を3つ紹介します。 1. bitsetは文字列のように扱える bitsetは、0と1のみを有効な値とするビットのコンテナです。開始インデックスと要素数を指定すれば、既存のbitsetの一部を使って新しいbitsetを作成し、末尾に連結することもできます。 たとえば、ビット列「01001110」のインデックス2から4要素を取
-
C++のベルマン・フォード法とは?仕組み・手順・実装例を徹底解説
ベルマン・フォード法(Bellman-Ford Algorithm)は、動的計画法に基づくアルゴリズムの一つで、指定した始点からグラフ内のすべての頂点への最短経路を求めるために使用されます。このアルゴリズムは反復的なアプローチを採用しており、最短経路の候補を繰り返し更新しながら答えを導き出します。重み付きグラフに対して適用できる点が大きな特徴です。 このアルゴリズムは1955年にアルフォンソ・シンベル(Alphonso Shimbel)によって提案されました。その後、1956年と1958年にリチャード・ベルマン(Richard Bellman)とレスター・フォード(Lester Ford)に
-
C++で3D空間における2つの平面間の角度を求める方法
3D空間における2つの平面間の角度について学ぶには、まず「平面」と「角度」の基礎概念を理解しておく必要があります。平面(Plane)とは、無限に広がる二次元の面のことです。角度(Angle)とは、1点で交わる2つの直線や面の間にできる空間を度数(°)で表したものです。この問題では、3D空間における2つの平面間の角度を求めます。互いに交わる2つの平面が与えられ、その交わる角度を計算することになります。2つの3D平面間の角度を計算するには、それぞれの平面の法線ベクトル間の角度を求めるのがポイントです。ここに、次の2つの平面があるとします。p1 : ax + by + cz + d = 0 p2 :
-
与えられた3辺から三角形の外接円の面積を求めるC++プログラム
任意の三角形の外接円の面積を求めるには、まずこの問題に関連する基本的な概念を押さえておく必要があります。 基本となる概念 三角形 … 3つの辺を持つ閉じた図形です。 円 … 辺を持たない(あるいは無数の辺を持つとみなせる)閉じた図形です。 他の図形を内側にすっぽりと包み込むように描かれた円を外接円と呼びます。三角形の場合、外接円は3つの頂点すべてを通る円になります。 外接円の半径を求める公式 三角形の3辺の長さをそれぞれ a、b、c とすると、外接円の半径 r は次の数学公式で求められます。 r = abc / √((a+b+c)(a+b−c)(a+c−b)(b+c−a)) この式は、ヘロンの
-
六角形に内接する最大の三角形の面積を求めるC++プログラム
正六角形に内接する最大の三角形の面積を求めるには、まずそれぞれの図形がどのような性質を持つのか、そして一方の図形がもう一方にどのように内接するのかを理解しておく必要があります。 三角形と六角形の基本 三角形は3つの辺からなる閉じた図形で、各辺の長さは等しい場合もあれば、異なる場合もあります。 六角形は6つの辺からなる閉じた図形で、こちらも辺の長さが等しい場合も異なる場合があります。 なぜ最大の三角形は正三角形になるのか 六角形に内接する三角形は、そのすべての頂点が六角形の頂点に接します。そのため、三角形の各辺は正六角形の対角線として扱うことができます。 ここで対象とするのは正六角形である
-
C/C++でシステムをシャットダウンするプログラムを作成する方法
システムをシャットダウンするプログラムは、Windows、Linux、macOSなどのオペレーティングシステム上で動作し、コンピューターの電源を切り、開いているすべてのアプリケーションを閉じることができます。シャットダウン(電源オフ)とは?シャットダウンまたは電源オフとは、コンピューターの主要な構成要素への電力供給を、定められた正しい手順に従って安全に遮断し、コンピューターが行っているすべての作業(アプリケーションの動作や各種処理)を終了させることを意味します。シャットダウン後は、CPU、RAMモジュール、ハードディスクドライブなどの主要コンポーネントの電源が切られますが、内部時計など一部の内
-
C++で解く合計配列パズル|自身を除いた要素の総和を効率的に求める方法
配列(Array)とは 配列とは、同じデータ型の複数の要素をまとめて格納できるデータ構造です。複数の値を一度に扱えるのが大きな特徴ですが、その長さはあらかじめ定義しておく必要があります。 合計配列パズルとは このパズルでは、サイズ n の配列 A1 が与えられます。これを解くために、配列 S1 を作成します。S1 には、対応する位置の要素を除いた A1 の全要素の合計を格納します。たとえば S1[3] を計算する場合、A1 の 4 番目の要素(インデックス 3)以外のすべての要素の合計を求めることになります。 具体例 配列 A1 = {1, 2, 3, 4, 6} 出力 S1 = {15, 1
-
C/C++のabs()・labs()・llabs()関数とは?絶対値を求める整数関数の使い方
Cライブラリにおける整数関数とは? 整数関数とは、引数として受け取った整数値に対して処理を行い、その結果を返す関数のことです。C言語では整数値のみがサポートされており、これらの関数は引数以下で最も近い整数値を返します。 整数関数には以下の3種類があります。 int = abs(int n); long = labs(long n); long long = llabs(long long n); ここで n は整数値を表します。 abs()・labs()・llabs()関数の概要 これらの関数は、<cstdlib>ヘッダファイル(C標準ユーティリティライブラリ)で定義されています
-
C++で絶対差の合計が最小となる配列要素を求める方法
このプログラムは、重複しない要素からなる配列が与えられたときに、各要素の絶対差の合計が最小となる値を求めるものです。この概念をより深く理解するために、まず必要な基礎知識をおさらいしましょう。配列(Array)とは、同じデータ型の要素を格納するためのコンテナです。配列の長さは事前に定義しておく必要があります。絶対差(Absolute Difference)とは、2つの数値の差の絶対値のことです。つまり、差は常に正の値となり、負の値は正の値に変換されます。各要素について最小絶対差を求め、その合計を計算します。最小絶対差の公式は次のとおりです。Minimum Absolute Difference
-
【C++】出現頻度が素数となる配列要素(文字)を見つける方法
配列と素数頻度とは 配列(Array)とは、同じデータ型の要素を格納するためのコンテナです。 素数頻度(Prime Frequency)とは、配列内の要素が出現する回数が素数になっていることを意味します。 これらの定義に基づき、本記事では「出現回数が素数となっている配列要素を見つける」という問題を扱います。具体的には、文字列が与えられたとき、各文字の出現頻度を求め、その頻度が素数であればカウントしていく流れになります。 入力例 Input: str = helloworld Output: 2 解説 まず、文字列内の各文字の出現回数を数えてみましょう。 h → 1 e → 1 l → 3
-
【C++】左右の偶数・奇数の個数が等しくなる配列インデックスを見つけるプログラム
問題の概要「両側で偶数(または奇数)の個数が同じになる配列インデックス」とは、ある要素の左側と右側に含まれる偶数の個数、または奇数の個数が互いに等しくなるような位置のことです。つまり、「左側の個数=右側の個数」を満たすインデックスを見つける問題です。まず、この概念に関連する基本用語を確認しておきましょう。基本用語の定義配列(Array):同じデータ型の要素を格納するためのコンテナ(データ構造)です。配列インデックス(Array Index):配列内の要素の位置を示す番号です。インデックスは必ず0から始まります。偶数:2で割り切れる整数のことです。奇数:2で割り切れない整数のことです。すべての整
-
すべての要素がK以上になるまで配列の要素を追加するC++プログラム|最小ヒープによる効率的な解法
ソートされていない整数の配列 arr[] と整数 K が与えられたとき、配列内の2つの要素を選んで足し合わせて1つの要素にする操作を繰り返し、すべての要素を K 以上にするまでに必要な最小の操作回数を求めるのが本記事のテーマです。問題の例Input: arr[] = {1 10 12 9 2 3}, K = 6 Output: 2解説まず (1 + 2) を加算すると、新しい配列は 3 10 12 9 3 になります。次に (3 + 3) を加算すると、新しい配列は 6 10 12 9 となります。この時点で、リスト内のすべての要素が 6 以上になっていることが確認できます。したがって、答えは
-
C++でアダム数(Adam Number)を判定する方法
アダム数(Adam Number)とは、ある数を2乗した結果が、その数の桁を逆順に並べた数の2乗をさらに逆順にしたものと一致するような数のことです。 アダム数の概念 ある数がアダム数であるためには、「元の数の2乗」と「元の数を逆順にした数の2乗をさらに逆順にしたもの」が等しくなる必要があります。具体例で確認してみましょう。 例:12の場合 ・12の2乗は 144 ・12の桁を逆順にすると 21 ・21の2乗は 441 ・441は、144(12の2乗)を逆順にした数と一致します このように12はアダム数です。同様に、13や31などもアダム数に該当します(13² = 169、31² = 961