C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. 【C++】サイズkの連続する部分配列それぞれの最大値を求める方法

    問題の概要n個の要素を持つ配列と値kが与えられたとき、サイズkの連続する部分配列(スライディングウィンドウ)それぞれにおける最大値を求めることを考えます。例として、入力が arr = [3,4,6,2,8]、k = 3 の場合をみてみましょう。サイズ3の連続する部分配列は [3,4,6]、[4,6,2]、[6,2,8] の3つなので、それぞれの最大値である 6、6、8 が出力となります。アルゴリズム:デック(deque)を使った効率的な解法この問題は、両端キュー(デック)を利用することで効率的に解くことができます。手順は以下の通りです。デック Qi を用意し、まず最初のk個の要素を処理します最

  2. C++で挿入演算子(<<)をオーバーロードしてオブジェクトを出力する方法

    C++では、標準出力ストリーム cout を使って自作クラスのオブジェクトを直接表示できるようにするために、挿入演算子(<<)をオーバーロードするのが一般的です。この記事では、氏名情報を持つ Person クラスを例に、その具体的な実装方法をわかりやすく解説します。 課題の概要 まず、f_name(名)と l_name(姓)という2つの文字列属性を持つ Person クラスを考えます。このクラスには、それぞれの値を取得するためのメソッド get_first_name() と get_last_name() が用意されています。 目的は、挿入演算子(<<)をオーバーロー

  3. C++で加算演算子をオーバーロードして2つの行列を加算する方法

    C++では演算子オーバーロードを利用することで、クラスオブジェクト同士に対して「+」などの演算子を直感的な形で適用できます。本記事では、2つの行列 mat1 と mat2 を加算して3つ目の行列を作成する処理を、加算演算子 + のオーバーロードによって実装する方法を解説します。 入力例と出力例 たとえば、次の2つの行列を入力とした場合を考えます。 行列1: 589679 行列2: 834763 このとき、対応する位置の要素同士を足し合わせた結果として、次の出力が得られます。 131113131312 解き方のアプローチ この問題は、以下の手順で解くことができます。 加算演算子 operato

  4. 入力として与えられたさまざまなデータ型の値を精度を維持して出力するC++プログラム

    問題の概要 整数値(int)、長整数値(long)、文字値(char)、単精度浮動小数点数(float)、倍精度浮動小数点数(double)の5つの異なる型の値が入力として与えられたとします。私たちのタスクは、入力として渡されたこれらの値を、それぞれの精度を維持したまま出力することです。 たとえば、以下のような値が入力された場合を考えてみましょう。 整数値(int)= 15 長整数値(long)= 59523256297252 文字値(char)= y float値 = 367.124 double値 = 6464292.312621 この場合、期待される出力は次のようになります。 15

  5. 配列内の特定の値を検索するC++プログラム:二分探索による効率的な実装

    問題概要ソート済みのn個の整数値を含む配列「arr」が与えられているとします。さらに、サイズqの配列「query」も与えられ、「query」内の各値が配列「arr」に存在するかどうかを判定する必要があります。queryの値がarrに存在する場合:「Present」と、その値が位置するインデックスを出力するqueryの値がarrに存在しない場合:「Not present」と、queryの値より大きい最小値がarr内で位置するインデックスを出力するなお、配列は1-indexed(先頭の要素を1番目として数える)であることに注意してください。入力例n = 8, arr = {1, 2, 3, 4,

  6. C++で3つのdouble値を指定形式に整形して出力するプログラム

    ここでは、3つのdouble型の値が与えられ、それぞれを決められた書式に整形して出力する方法を解説します。求められる出力形式は次のとおりです。1つ目の値は整数部分を取り出し、小文字の16進数形式で出力します。2つ目の値は小数点以下2桁まで出力し、正負を表す符号(+/-)を先頭に付けます。全体は15文字幅で右寄せとし、余った左側の空白はアンダースコア(_)で埋めます。3つ目の値は小数点以下9桁まで、指数表記(科学技術表記)で出力します。入力例と出力例たとえば、入力が「256.367」「5783.489」「12.5643295643」だった場合、出力は次のようになります。0x100 _______

  7. 【C++】マルチレベル継承(多段継承)の基本と実装例をわかりやすく解説

    マルチレベル継承とはマルチレベル継承(多段継承)とは、あるクラスが別のクラスから派生し、さらにその派生クラスから新たなクラスが派生するといった、親子関係が段階的に連なる継承の形態です。C++では「class 派生クラス名 : public 基底クラス名」という構文で実現でき、最下層の派生クラスは、直接の基底クラスだけでなく、その上位にあるすべての基底クラスのpublicメンバーを利用することができます。プログラムの概要ここでは、Vehicle(乗り物)、FourWheeler(四輪車)、Car(車)という3つのクラスを例に考えます。Vehicleクラスが基底クラスであり、FourWheeler

  8. C++マクロの機能を解説:配列の最大値と最小値の差を求めるプログラム

    問題概要 いくつかの整数値が格納された整数型の配列が与えられます。この配列の中から最小値と最大値を見つけ出し、その差を求めるのが課題です。ただし、この問題を解く際にはC++のマクロを必ず使用しなければなりません。入力は標準入力(stdin)から受け取り、結果は標準出力(stdout)に出力します。 例えば、入力が array = {120, 589, 324, 221, 234} の場合、出力は次のようになります。 The answer is : 469 これは、最大値の 589 と最小値の 120 の差が 469 であることを意味します。 解法のアプローチ この問題は、次の手順で解くことがで

  9. C++で例外処理を実装するプログラムの書き方

    複雑な数学的演算を行う関数があるとしましょう。その演算の過程では、さまざまな例外が発生する可能性があります。発生しうる例外の種類ごとに適切に処理し、次のように対応する必要があります。コンピュータが計算用のメモリを確保できない場合は、「Memory Low!」と出力するその他のC++関連の標準例外が発生した場合は、「Exception:」に続けて例外の内容を出力する上記以外の例外が発生した場合は、「Unhandled Exception」と出力するここでは、値のペアを格納した配列が与えられ、それを関数に渡す状況を考えます。例外が発生した場合はそれを捕捉して処理し、問題がなければ計算結果を出力しま

  10. 複数の大きな数を合計するC++プログラム

    問題の概要 いくつかの大きな数が格納された配列 nums が与えられます。これらの数値は非常に大きく、通常の int 型では扱いきれない可能性があります。この記事では、これらの数値の合計を正確に求める方法を解説します。 例えば、入力が nums = [5000000003, 3000000005, 8000000007, 2000000009, 7000000011] の場合、出力は 25000000035 となります。 解決の手順 変数 x を 0 で初期化します i を 0 から配列 nums のサイズ未満まで1ずつ増やしながら、以下の処理を繰り返します x に nums[i] を加

  11. C++で2次元デカルト座標点をすべて接続する最小コストを求めるプログラム

    問題の概要2次元デカルト座標上の点のリスト(x, y)が与えられたとします。点(x0, y0)と(x1, y1)を接続するときのコストは、|x0 − x1| + |y0 − y1|(マンハッタン距離)で表されます。任意の数の点を接続できる場合、すべての点がひとつのパスでつながるようにするために必要な最小コストを求めます。例えば、入力が points = [[0, 0], [0, 2], [0, -2], [2, 0], [-2, 0], [2, 3], [2, -3]] の場合を考えてみましょう。このとき出力は 14 になります。その理由は以下の通りです。(0, 0) から (0, 2)、(0

  12. C++で1だけで構成される部分行列の個数を数えるプログラム

    0と1のみから構成される行列が与えられたとき、その中に存在する「すべての要素が1である部分行列」の個数を求める問題を考えてみましょう。求めた個数を出力として表示します。入力例例えば、次のような行列が入力として与えられたとします。0010010001011101この場合、すべての要素が1である部分行列は全部で12個存在するため、出力は 12 となります。解法のアプローチこの問題を効率的に解くには、二次元累積和(2Dプレフィックスサム) と 二分探索 を組み合わせます。手順は以下の通りです。n を行列の行数、m を行列の列数とします。(n+1) × (m+1) のサイズを持つ配列 add(二次元累

  13. C++で要素の合計が指定した値と等しくなる部分行列の個数を求めるプログラム

    整数要素を含む行列が与えられたとき、その中から要素の合計が指定した目標値(target)と等しくなる部分行列をすべて見つけ、その個数を返すことを考えます。 問題の例 例えば、次のような行列が入力だとします。 0010010001011101 ここで target = 5 とすると、出力は 3 になります。これは、要素の合計が 5 に等しい部分行列がちょうど 3 つ存在するためです。具体的には、「下2行全体」「上から2〜4行目 × 左から2〜4列目」「すべての行 × 左から3列目まで」の3つが該当します。 解法のアプローチ この問題は、「1次元配列内で合計が k になる連続部分配列の個数を数

  14. C++で整数配列を1つの値にマージする最小コストを求めるプログラム

    n個の正の整数を含む配列 arr と、整数 j が与えられます。私たちの課題は、j個の数値を選んで足し合わせることで、それらを1つの数値にマージすることです。マージのコストは、選択したj個の数値の合計に等しくなります。このマージ操作全体にかかる最小のコストを求めるのが目標です。例えば、入力が arr = [2, 5, 6, 2, 3, 1, 3]、j = 4 の場合、出力は 31 になります。まず、2, 3, 1, 3 をマージするコストは 2 + 3 + 1 + 3 = 9 です。このマージ操作の後、配列は [2, 5, 6, 9] となります。続く2回目のマージ操作のコストは 2 + 5

  15. C++でエンコードされたメッセージをデコードする方法の数を求めるプログラム

    問題の概要エンコードされたメッセージとして、整数の数字からなる文字列が与えられたとします。これらの数字は、アルファベットの特定の文字にマッピングされます。具体的には、a は 1、b は 2、c は 3 というように対応しています。さらに、メッセージにはワイルドカードとして文字「*」が含まれることがあり、これは 1 から 9 までの任意の数字にマッピングできるとします。メッセージ input が与えられたとき、そのメッセージをデコードできる方法が何通りあるかを求めるのがこの問題です。具体例例えば、入力が input = "18" の場合、出力は 2 になります。このメッセージ

  16. C++で正の整数を英語の単語表記に変換するプログラムの作成方法

    問題の概要正の整数が与えられたとき、その数値を英語の単語(スペル)に変換することを考えます。例えば、入力が「56」であれば、出力は「Fifty-Six」となります。変換できる範囲は10億(1,000,000,000)までです。つまり、入力が input = 5678 の場合、出力は「Five Thousand Six Hundred Seventy Eight」になります。解法のアプローチこの問題は、数値と対応する英単語のペアを大きな単位から順に配列へ格納し、再帰的に数値を分解していくことで解けます。具体的な手順は以下の通りです。ステップ1:単語と数値のペア配列「numbers」を定義するまず

  17. C++で配列内の全要素ペアのk番目に小さい差を求めるプログラム

    問題概要いくつかの整数を含むリストが与えられます。配列内のすべての値のペアについて差を計算し、その中からk番目に小さい差を見つける必要があります。インデックスは0から始まり、値kは入力として与えられます。例えば、入力が numbers = {2, 6, 4, 8}、k = 2 の場合、出力は 2 になります。各ペア間の差は以下の通りです。(2, 6) = 4(2, 4) = 2(2, 8) = 6(6, 4) = 2(6, 8) = 2(4, 8) = 4これらの値をソートすると「2, 2, 2, 4, 4, 6」となり、2番目に小さい値は 2 です(インデックスは0から開始)。解法のアプロー

  18. 【C++】映画祭で参加者が最後まで観られる映画の最大本数を求めるプログラム

    問題の概要 さまざまな国の映画が上映される映画祭が開催されているとしましょう。参加者は、上映時間が互いに重ならない映画をできるだけ多く観たいと考えています。そこで本記事では、参加者が最大で何本の映画を最初から最後まで観られるのかを求めるC++プログラムを紹介します。 まず、次のメンバーを持つ構造体 Movie を定義します。 映画の開始時刻 映画の上映時間(長さ) 映画の終了時刻 さらに、次のメンバーを持つ構造体 Festival を定義します。 映画祭で上映される映画の本数 映画の本数と同じサイズの Movie 型配列 各映画の開始時刻と上映時間をそれぞれ格納した2つの配列 tim

  19. 【C++】漸化式で生成される数列に含まれる異なる要素の個数を求める方法

    問題概要3つの整数 n、x、y、z が与えられます。これらの値をもとに、次のルールで数列を作成します。数列の最初の項:x mod 2312番目以降の項:ai = (a(i-1) × y + z) mod 231(ただし 1 ≤ i ≤ n - 1)このようにして作成した数列に含まれる異なる整数の個数を求めるのが、この問題の目的です。入出力例たとえば、入力が n = 5、x = 1、y = 2、z = 1 の場合、出力は 5 になります。実際に数列を計算すると、一意な値は {1, 3, 7, 15, 31} となるため、答えは 5 です。解法の考え方この問題は、以下の手順で解くことができます。M

  20. C++でバイナリ配列全体をパワフルにするために必要な最小の「1」の個数を求める方法

    任意のサイズのバイナリ配列(0 と 1 のみを格納)と、整数型の変数 base が与えられます。この課題の目的は、配列全体を「パワフル」な状態にするために、ほかの要素へ力を貸す必要のある最小の「1」の個数を求めることです。ある要素は、隣接する要素や、距離が base より小さい範囲内にある任意の要素へ力を貸すことができます。 入出力のシナリオ ケース 1: base = 7 の場合 入力: int arr[] = {1, 1, 0, 1, 1, 0, 1}、int base = 7 出力: 配列全体をパワフルにするために必要な最小の「1」の数: 1 説明: サイズ 7 のバイナリ配列に対して

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:271/300  20-コンピューター/Page Goto:1 265 266 267 268 269 270 271 272 273 274 275 276 277