-
C++で方程式 f(x, y) = z を満たす正の整数解をすべて求める方法
問題の概要2つの引数 (x, y) を受け取る関数 f があると仮定します。この関数は単調増加関数であり、次の性質を持ちます。f(x, y) < f(x + 1, y)f(x, y) < f(x, y + 1)つまり、x または y の値を大きくすると、必ず f の戻り値も大きくなります。このとき、入力として与えられた z に対して、f(x, y) = z を満たす正の整数 x、y の組み合わせをすべて求めるのが本記事の目的です。解き方:全探索アプローチここでは、最も理解しやすい全探索(ブルートフォース)の手法を採用します。変数 i を 1〜1000、変数 j を 1〜1000 の
-
C++で行列のインクリメント操作後に奇数値となるセルの数を求める方法
n 行 m 列の行列を考えます。この行列は、すべての要素が 0 で初期化されています。さらに、indices[i] = [ri, ci] の形式でインデックスのペアが与えられます。各ペア [ri, ci] に対して、行 ri に属するすべてのセルと列 ci に属するすべてのセルの値を 1 ずつ加算します。すべてのインデックスに対してこの操作を適用した後、値が奇数になっているセルの総数を求めるのがこの問題の目的です。 解法のステップ この問題は、与えられた操作をそのままシミュレーションすることで解決できます。具体的な手順は以下の通りです。 カウンタ odd を 0 で初期化し、変数 x にはイ
-
C++で全ての点を訪問するための最小時間を求めるアルゴリズム
配列として与えられた複数の点(座標)があります。このとき、すべての点を訪問するのに必要な最小時間(秒)を求める問題を考えます。ただし、以下の条件が課せられています。1秒につき、上下・左右・斜めのいずれかの方向へ1マス移動できる点は配列に現れる順序どおりに訪問しなければならない例えば、点が [(1, 1), (3, 4), (-1, 0)] と与えられた場合、出力は 7 になります。最短経路をたどる際の移動の順序は、(1, 1) → (2, 2) → (3, 3) → (3, 4) → (2, 3) → (1, 2) → (0, 1) → (-1, 0) となります。解き方のアプローチこの問題を
-
C++で整数の各桁の積と和の差を求める方法
ある整数が与えられたとき、その各桁の合計(和)と積をそれぞれ求め、両者の差を計算する問題を考えてみましょう。例えば、数値が 5362 の場合を考えてみます。桁の和:5 + 3 + 6 + 2 = 16桁の積:5 × 3 × 6 × 2 = 180したがって、求める差は 180 − 16 = 164 となります。解き方のアプローチこの問題は、以下の手順で解くことができます。数値を10で割った余り(% 10)を使って、下の桁から1桁ずつ取り出します。取り出した各桁を、和を求める変数に加算し、積を求める変数に乗算していきます。数値が0になるまで10で割り続け、すべての桁を処理します。最後に「積 −
-
C++でソート済み配列から25%を超えて出現する要素を効率的に見つける方法
問題の概要 配列Aが与えられます。配列には複数の要素が含まれており、その中には重複する要素もあります。この問題では、配列全体の25%を超える割合で出現している要素を1つ見つけて返す必要があります。 例えば、A = [1, 2, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7] の場合を考えてみましょう。この配列のサイズは12なので、25%に相当するのは3回です。ここで「4」は4回出現しており、25%を超えているため、答えは「4」となります。 解決のアプローチ この問題は、ハッシュマップ(unordered_map)を使って各要素の出現回数を数えることで、シンプルに解くことができます。
-
C++で配列の各要素を右側の最大値に置き換える方法
配列 A が与えられたとします。この問題では、各要素を「その要素より右側にある要素の中で最大のもの」に置き換え、最後の要素は -1 に置き換える必要があります。 例えば、A = [5, 17, 40, 6, 3, 8, 2] の場合、結果は [40, 40, 8, 8, 8, 2, -1] となります。 解法のアプローチ この問題は、配列を右から左へ走査することで、時間計算量 O(n)・空間計算量 O(1) という非常に効率的な形で解くことができます。手順は以下の通りです。 配列の要素を右から左へ順に読み取ります。 変数 e を -1 で初期化します(これは「右側の最大値」を保持する変数です
-
C++で合計が0になるN個の一意な整数の配列を生成する方法
問題概要整数 n が与えられたとき、合計が 0 になる n 個の「一意な(重複しない)整数」を含む配列を返すことを考えます。たとえば、入力が n = 5 の場合、[-7, -1, 1, 3, 4] のような配列が有効な答えのひとつになります。解法のアプローチこの問題は、非常にシンプルな発想で解くことができます。1 から n-1 までの整数を順に配列に格納しながら、それらの合計を記録しておきます。最後に、その合計の符号を反転した値を配列の末尾に追加すれば、配列全体の合計は必ず 0 になります。具体的な手順は以下の通りです。答えとなる配列 A を用意し、変数 x を 0 で初期化します。i を 0
-
C++ STLのdeque::assign()関数の使い方を徹底解説
本記事では、C++ STLにおける deque::assign() 関数の動作について詳しく解説します。デック(deque)は「double ended queue(両端キュー)」と呼ばれるデータ構造で、先頭と末尾の両方から要素の挿入・削除が可能なコンテナです。C++の deque::assign() は組み込み関数の一つで、dequeコンテナに新しい値を割り当てるために使用されます。この関数が呼び出されるたびに、既存の要素をすべて置き換えて新しい値を設定し、それに応じてコンテナのサイズも自動的に調整されます。構文deque::assign() の構文は以下の通りです。dequename.as
-
C++STLのlist back()関数の使い方を解説
C++のlist back()関数とは本記事では、C++におけるlist back()関数の動作について詳しく解説します。list::back()関数は、C++標準テンプレートライブラリ(STL)の一部であり、リストの最後(末尾)の要素を取得・表示するために使用されます。この関数を呼び出す前に、必ず<list>ヘッダーファイルをインクルードする必要がある点に注意してください。構文List_Name.back();パラメータこの関数は、いかなるパラメータも受け取りません。戻り値この関数は、リストの最後の要素の値を返します。なお、リストが空の場合の動作は未定義となるため、呼び出し前にリ
-
C++ STLのlist::cbegin()とcend()関数の使い方を解説
本記事では、C++におけるlist::cbegin()およびlist::cend()関数の動作について解説します。list::cbegin()とlist::cend()は、C++標準テンプレートライブラリ(STL)の一部として提供されているメンバ関数です。これらの関数を呼び出すには、ヘッダーファイル<list>をインクルードする必要があります。list::cbegin()とはlist::cbegin()は、リストの先頭要素を指す定数イテレータ(const_iterator)を返す関数です。このイテレータを使えばリストを走査することはできますが、リスト内の値を変更することはできません
-
C++ STLのlistにおけるcrbegin()・crend()関数の使い方を解説
C++のSTL(標準テンプレートライブラリ)には、リストを逆方向に走査するための便利なメンバ関数が用意されています。本記事では、list::crbegin()とlist::crend()の2つの関数の動作について詳しく解説します。これらの関数はC++標準テンプレートライブラリの一部であり、使用するには<list>ヘッダーをインクルードする必要があります。list::crbegin()とはlist::crbegin()は、リストの逆先頭(つまりリストの末尾要素)を指す定数リバースイテレータを返します。この関数を使うと、リストを末尾から先頭へ向かって辿ることができますが、イテレータを通
-
C++ STLのlist::assign()関数の使い方をわかりやすく解説
本記事では、C++におけるassign()関数の動作について詳しく解説します。 list::assign()関数はC++標準テンプレートライブラリ(STL)の一部であり、リストに新しい値を代入したり、あるリストから別のリストへ値をコピーしたりするために使用されます。 この関数を呼び出すには、<list>ヘッダーファイルをインクルードする必要があります。 構文①:サイズと値を指定して代入する リストに新しい値を代入する場合の構文は以下の通りです。 List_Name.assign(size, value) 構文②:別のリストから値をコピーする あるリストから別のリストへ値をコピー
-
C++ STLのlist emplace()関数の使い方を徹底解説
本記事では、C++におけるlist emplace()関数の動作について詳しく解説します。list::emplace()関数は、C++標準テンプレートライブラリ(STL)の一部であり、ユーザーが指定した位置にリストへ新しい要素を挿入するために使用されます。この関数を呼び出すには、<list>ヘッダーファイルをインクルードする必要があります。構文List_Name.emplace(position, element)パラメータこの関数は、以下の2つのパラメータを受け取ります。1つ目はposition(位置)で、新しい要素を挿入する位置を表します。2つ目はelement(要素)で、指定
-
C++のcopysign()関数とは?使い方と動作をわかりやすく解説
本記事では、C++におけるcopysign()関数の使い方と動作について詳しく解説します。copysign()関数は、C++標準ライブラリに含まれる数学関数の一つです。2つの引数を受け取り、「第1引数の大きさ(絶対値)」と「第2引数の符号」を組み合わせた値を結果として返します。この関数を使用するには、<math.h> または <cmath> ヘッダーファイルをインクルードする必要があります。構文copysign(x,y)使用例入力: copysign(4,-5) 出力: -4解説:この例では、一方の値の符号をもう一方の値の大きさへコピーする仕組みを示しています。第2引数
-
C++で複素数のcos()関数を使う方法
この記事では、C++において複素数に対するcos()関数を使用する方法について解説します。 cos()関数はC++の標準テンプレートライブラリ(STL)の一部であり、通常の数学関数であるcos()とは少し異なるものです。単純な整数や有理数のコサインを計算するのではなく、複素数の複素コサイン値を計算します。 複素コサインを計算するための数式は以下の通りです − cos(z) = (e^(iz) + e^(-iz))/2 ここで「z」は複素数を、「i」は虚数単位を表します。 複素数は以下のように宣言します − complex<double> name(a,b) ここで、complex
-
C++における複素数のcosh()関数の動作と使い方
この記事では、C++において複素数に対するcosh()関数がどのように動作するのかを解説します。 cosh()関数とは cosh()関数はC++標準テンプレートライブラリ(STL)の一部ですが、通常のcosh()関数とは少し異なる動作をします。標準のcosh()関数がラジアン単位の角度の双曲線余弦(ハイパボリックコサイン)を計算するのに対し、こちらは複素数の複素双曲線余弦の値を計算します。 複素双曲線余弦を求めるための数学的な定義式は次のとおりです。 cosh(z) = (e^z + e^-z) / 2 ここで、「z」は複素数を、「i」は虚数単位(イオタ)を表します。 複素数は次のように宣言し
-
【C++】clocaleヘッダーファイルの使い方を解説
本記事では、C++における<clocale>ヘッダーファイルの使い方について詳しく解説します。 <clocale>ヘッダーファイルは、ローカライゼーション(地域化)ライブラリの一部であり、そのローカライゼーションライブラリはC++標準ライブラリの一部です。もともとは、C標準ライブラリに<locale.h>という名前で存在していました。 このヘッダーファイルに含まれる関数や宣言は、各国の日付形式や通貨記号を扱う処理など、ロケール(地域情報)に依存するタスクに使用されます。 <clocale>ヘッダーファイルには、setlocale()とlocal
-
C++のconst_castとは?型キャスト演算子の基本と使い方を徹底解説
この記事では、C++における const_cast の動作と使い方について詳しく解説します。const_castとはconst_cast は、C++に用意されている型キャスト演算子の一つです。主な用途は、オブジェクトからconst(定数)性を取り除くことです。つまり、本来変更できないはずの定数オブジェクトを、あたかも書き換え可能なオブジェクトであるかのように扱えるようにします。プログラムの中で「基本的には定数として扱いたいが、特定のタイミングでのみ値を変更したい」というオブジェクトがある場合に、const_cast が役立ちます。構文const_cast の構文は以下の通りです。const_c
-
C++のconst_castとは?定数キャストの使い方を実例で解説
この記事では、C++におけるconst_castの動作と使い方を解説します。 const_castは、C++に用意された型キャスト演算子の一つです。オブジェクトの定数性(const指定)を変更するために使用され、言い換えれば、オブジェクトからconstの性質を取り除く役割を果たします。 たとえば、普段は定数として扱いたいものの、特定の場面でのみ値を書き換える必要があるオブジェクトが存在するプログラムでは、const_castが役立ちます。 構文 const_castの構文は以下の通りです。 const_cast<型名>(式) 例1:const_castの基本的な使い方 まず、入力
-
【C++】STLのset_difference()で1つ目の配列にのみ存在する要素を見つける方法
2つの配列が与えられたとき、C++のSTL(標準テンプレートライブラリ)を活用して、「1番目の配列には存在するが、2番目の配列には存在しない要素」を効率的に見つける方法を解説します。例入力: array1[ ] = {1, 2, 3, 4, 5, 7} array2[ ] = {2, 3, 4, 5, 6, 8} 出力: 1, 7 入力: array1[ ] = {1, 20, 33, 45, 67} array2[ ] = {1, 12, 13, 114, 15, 13} 出力: 20, 33, 45, 67解決のアプローチこのプログラムでは、1番目の配列に存在し、