C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で二分探索木(BST)を最大ヒープに変換する方法

    はじめに このチュートリアルでは、二分探索木(BST)を最大ヒープに変換するプログラムについて解説します。 入力として二分探索木が与えられ、それを最大ヒープへと変換することが目的です。ただし、単にヒープ化するだけではなく、「要素同士を比較した際に二分探索木としての順序条件が引き続き成立する」ように変換しなければなりません。つまり、変換後の木は次の2つの性質を同時に満たす必要があります。 最大ヒープの性質:すべての親ノードの値が、その子ノードの値以上である 二分探索木の性質:任意のノードについて、左部分木の値 ≤ そのノードの値 ≤ 右部分木の値 が成り立つ アルゴリズムの考え方 この変換は

  2. C++で二分探索木(BST)を最小ヒープに変換する方法

    はじめにこのチュートリアルでは、二分探索木(BST:Binary Search Tree)を最小ヒープ(Min Heap)へ変換するプログラムの実装方法を解説します。入力として与えられるのは二分探索木です。私たちのタスクは、このBSTを「BST同士で比較した場合の条件」を満たす形で最小ヒープへ変換することです。つまり、元の木の構造(ノードの配置)はそのまま維持しつつ、各ノードに格納する値だけを入れ替えます。アルゴリズムの考え方変換は以下の2段階で行います。中順走査(Inorder Traversal)でBSTの全ノードの値を取得し、配列に格納します。BSTの中順走査は必ず昇順にソートされた結果

  3. C++で10進小数を2進数に変換する方法(小数点以下の精度指定あり)

    この記事では、C++を使って10進数の小数を2進数に変換するプログラムを解説します。入力として10進数の小数と整数「k」が与えられ、その小数を小数点以下k桁の精度で2進数表現に変換することがゴールです。変換の基本的な考え方整数部分の変換方法整数部分は、数値を2で割り続けて得られる余りを順に並べることで求められます。剰余は下位の桁から順に出てくるため、最後に文字列を反転させて正しい順序に整えます。小数部分の変換方法小数部分は、2を掛けた結果の整数部分を順番に取り出すことで求められます。2倍した値が1以上であれば「1」、1未満であれば「0」となり、1以上の場合は1を引いた残りの小数に対して同じ処理

  4. C++で任意の基数から10進数へ、またはその逆に変換する方法

    このチュートリアルでは、C++を使って任意の基数の数値を10進数に変換する方法と、その逆である10進数から任意の基数への変換を行うプログラムについて解説します。 ここでは、整数とその基数が与えられた際に、その数値を10進数表現へ変換する処理を実装します。さらに、逆の手順として、10進数の数値を指定した基数の表現に変換する方法もあわせて紹介します。 任意の基数から10進数への変換 この変換では、各桁の文字に対応する数値を求め、桁の位置に応じた基数の冪乗を掛け合わせてすべて合計します。文字列の末尾(最下位の桁)から順に処理することで、冪乗を効率的に更新しながら計算を進められます。 サンプルコード

  5. C++で要素を1つ追加して配列を等差数列に変換する方法

    このチュートリアルでは、要素を1つ追加することで、与えられた配列を等差数列(算術数列)に変換するプログラムについて解説します。 ここでは、整数の配列が与えられます。私たちのタスクは、その配列に要素を1つだけ追加して等差数列へと変換し、追加した要素の値を返すことです。もし等差数列への変換が不可能な場合は、-1 を返します。 アルゴリズムの考え方 まず配列を昇順にソートし、最初の2つの要素の差を公差 d とします。その後、3番目以降の要素について、隣接する要素間の差を順番に確認していきます。 すべての差が d と一致すれば、配列はすでに等差数列になっているため、末尾の要素に d を加えた値を返

  6. C++で文字列を変換して、すべての文字を一意にする方法

    このチュートリアルでは、与えられた文字列を変換して、すべての文字が一意(重複なし)になるようにするC++プログラムについて解説します。ここでは、小文字の英字からなる文字列が1つ与えられます。私たちのタスクは、文字列を先頭から順に走査し、2回以上出現している文字を、その時点で文字列内にまだ存在しない別の文字へ置き換えることです。アルゴリズムのポイント英小文字は26種類しか存在しないため、文字列の長さが26を超える場合には、どのように置き換えてもすべての文字を一意にすることはできません。そのようなケースでは「-1」を返す仕様になっています。処理の流れは以下の通りです。各文字(a〜z)の出現回数をサ

  7. C++で配列内に存在しない数値をすべて検索する方法

    n個の要素からなる配列を考えてみましょう。いくつかの要素は2回現れ、それ以外は1回だけ現れます。各要素は 1 ≤ A[i] ≤ n の範囲に収まっています。このとき、配列の中に存在しない数値をすべて見つけ出す必要があります。ただし制約として、追加のメモリ領域を使用せず、計算時間は O(n) 以内で解かなければなりません。 たとえば、配列が [4, 3, 2, 7, 8, 2, 3, 1] である場合、答えは [5, 6] になります。 解法のアプローチ この問題は「符号反転によるマーキング」というテクニックを使うことで、追加メモリなしで解決できます。手順は以下の通りです。 n を配列のサイズ

  8. C++で文字列が部分文字列の繰り返しから構成できるか判定する方法

    空でない文字列が与えられます。この文字列が、ある部分文字列を複数回連結することによって構成できるかどうかを判定するのが課題です。文字列は小文字の英字のみで構成され、長さは10,000を超えないものとします。たとえば、入力が abaabaaba の場合、答えは true になります。これは「aba」という部分文字列を3回繰り返すことで作られているためです。一方、「abac」のような文字列は同一の部分文字列の繰り返しでは構成できないため、false となります。アルゴリズムの考え方この問題は、KMP法(Knuth–Morris–Pratt法)で使われる「失敗関数(failure function)

  9. C++で文字列の大文字・小文字の全パターン(文字ケース順列)を生成する方法

    英字と数字が混在する文字列が与えられたとき、文字列に含まれる各英字について大文字と小文字の両方のバージョンを組み合わせ、考えられるすべての文字列パターンを生成することを考えます。文字列が数字のみで構成されている場合は、その文字列そのものだけを返します。 例として、文字列「1ab2」が与えられた場合、生成される結果は次のようになります。 [1ab2, 1Ab2, 1aB2, 1AB2] 解決アプローチ:再帰による全探索 この問題は再帰的なアプローチで解くことができます。基本的な考え方は以下の通りです。 処理を開始する位置を示すインデックスを引数として受け取ります。 そこまでの結果を保持する一時

  10. C++で長押しされた名前かどうかを判定する方法

    問題の概要ある人がキーボードで名前を入力している場面を考えてみましょう。入力中にボタンを誤って長押ししてしまうことがあり、その結果、本来の文字数よりも多くの同じ文字が入力されてしまうことがあります。そこで、2つの文字列を受け取り、2番目の文字列(typed)が1番目の文字列(name)を長押しして入力した結果になっているかどうかを判定するプログラムを作成します。例えば、元の名前が「Amit」で、2番目の文字列が「Ammittt」であれば、これは長押しによって生じた文字列とみなせます。一方、「Ammttt」は「i」という文字が含まれていないため、長押しとは判定できません。解法のアプローチこの問題

  11. C++で解く2都市スケジューリング問題:最小コストでN人ずつ振り分ける貪欲法

    問題概要2N人の人がいるとします。ある会社が面接を実施する予定で、i番目の人を都市Aへ飛行機で移動させる費用が costs[i][0]、都市Bへ移動させる費用が costs[i][1] として与えられています。各都市にちょうどN人ずつ到着するように全員を移動させるとき、合計費用の最小値を求めるのがこの問題の目的です。入力例例えば、入力が [[10, 20], [30, 200], [400, 50], [30, 20]] の場合、出力は 110 になります。具体的には、1人目をコスト10で都市Aへ、2人目をコスト30で都市Aへ送り、3人目と4人目はそれぞれコスト50と20で都市Bへ送ります。合

  12. C++で複素数の射影を計算するproj()関数の使い方を徹底解説

    C++のproj()関数とはこの記事では、C++において複素数に対する射影(プロジェクション)を計算するための proj() 関数の動作について詳しく解説します。proj() 関数は、与えられた複素数をリーマン球面へ射影した結果を返す標準ライブラリの機能であり、特に無限大を含む複素数を扱う際に重要な役割を果たします。まずは、proj() メソッドの基本構文を見ていきましょう。template <class T> complex<T>proj (const complex<T>& z);proj()関数の基本構文と動作proj() 関数は、引数として複

  13. C++の再帰処理を使ってピラミッドパターンを出力する方法

    この記事では、C++プログラミングにおける再帰処理(リカーシブ関数)を活用して、ピラミッド型のパターンを出力する方法を解説します。再帰とは、関数が自分自身を呼び出す仕組みのことで、繰り返し処理を簡潔かつ読みやすく記述できるのが大きな特徴です。 アルゴリズム ピラミッドパターンを出力するための手順は、以下の通りです。 Step-1 ピラミッドの高さを設定する Step-2 再帰関数を使ってスペース(空白)の数を調整する Step-3 再帰関数を使ってハッシュ(#)記号の数を調整する Step-4 両方の関数を組み合わせて呼び出し、ピラミッドパターンを出力する サンプルコード 上記のアルゴリズムに

  14. C++で蝶の形をした面白いパターンを出力する方法

    この記事では、C++プログラミングを用いて、蝶が翼を広げたような面白いパターンを出力する方法を解説します。二重ループと条件分岐を組み合わせるだけで、美しい対称模様を描くことができます。 アルゴリズム パターン出力の基本的な流れは、以下の3つのステップで構成されています。 ステップ1: パターンのサイズを定義する(出力時は自動的に2倍の幅になる) ステップ2: ループ処理を使ってパターンの上半分を出力する ステップ3: ループ処理を使ってパターンの下半分を出力する サンプルコード 上記のアルゴリズムに基づいて作成したC++コードが以下の通りです。 #include <iostream>

  15. C++で半ピラミッドパターンを出力する方法を解説

    この記事では、C++プログラミング言語を使用して、半ピラミッド状のパターンをコンソールに出力する方法を解説します。目的のパターンを実現するために、以下のアルゴリズムを設計しました。アルゴリズムステップ1:パターンの高さ(行数)を設定する ステップ2:外側のループで行数を処理する ステップ3:内側のループで列数を処理する ステップ4:文字(@)でパターンを出力する ステップ5:各行の終わりで改行する(内側のループの外で処理) ステップ6:設定した高さに達するまでループを繰り返すサンプルコード上記のアルゴリズムに従って作成したC++のソースコードは以下の通りです。#include <iost

  16. C++で文字の重複を許して文字列の全順列を辞書順に出力する方法

    この問題では、n 文字からなる文字列が与えられ、その文字列を構成する文字を使ったすべての順列を出力します。ここでは同じ文字の繰り返し(重複)が許されており、順列は辞書順(アルファベット順)で出力する必要があります。問題の例まず、具体例で内容を確認してみましょう。入力: XY出力: XX、XY、YX、YY解き方:「固定して再帰する」アプローチこの問題を解くには、「fix and recur(固定と再帰)」という考え方を利用します。手順は以下の通りです。結果用バッファの先頭の位置に、元の文字列から1文字を選んで固定します。残りの位置について、再帰的に同じ処理を呼び出して文字を埋めていきます。最後の

  17. 【C++】文字列のすべての順列を辞書式順序(ソート順)で出力する方法

    問題概要この問題では、長さ n の文字列が与えられ、その文字を並べ替えてできるすべての順列を、ソートされた順序(辞書式順序)で出力することが求められます。具体例を使って問題を確認してみましょう。入力: 「XYZ」出力: XYZ、XZY、YXZ、YZX、ZXY、ZYXつまり、すべての順列を辞書式順序(アルファベット昇順)で列挙して出力する必要があります。解決のアプローチこの問題を解くための基本的な手順は以下の通りです。まず文字列全体をアルファベット昇順にソートします。ソート後の文字列が順列の最初の要素になります。現在の順列から「次に大きい順列」を繰り返し生成していきます。「次の順列」を求める処理

  18. C++で4方向の移動を許可して、行列の左上から右下までのすべての経路を出力する方法

    問題の概要この問題では、m×n の2次元行列が与えられ、行列の左上のセルから右下のセルまでの、取り得るすべての経路を出力することを目標とします。移動として許可されているのは、左・右・上・下の4方向です。実際には「右」と「上」への移動はあまり使われることがありませんが、状況によっては有効に働くこともあります。具体例まず、例を見ながら内容を理解しましょう。入力:1 3 5 2 8 9出力:1 -> 3 -> 5 -> 9 1 -> 3 -> 8 -> 9 1 -> 2 -> 8 -> 9解法のアプローチこの問題は、あるセルから隣接するセルへ順

  19. C++で始点から終点までのすべての経路を出力する方法|深さ優先探索(DFS)による実装

    この記事では、有向グラフが与えられたときに、始点(ソース)から終点(デスティネーション)までのすべての経路を出力する問題を、C++で解く方法を解説します。有向グラフとは?有向グラフとは、各辺に向きが定められており、頂点Aから頂点Bへと一方向に進むことができるグラフのことです。逆向き(BからA)には、対応する逆向きの辺が存在しない限り移動できません。問題の例具体例を使って問題を理解しましょう。下図のようなグラフを考えます。始点を「K」、終点を「P」とした場合の出力は次のようになります。出力:K -> T -> Y -> A -> P K -> T -> Y -

  20. C++のBFS(幅優先探索)で始点から終点までのすべての経路を出力する方法

    この記事では、有向グラフが与えられたときに、幅優先探索(BFS)を用いて始点(ソース)から終点(デスティネーション)までのすべての経路を出力する方法を解説します。 有向グラフとは 有向グラフとは、各辺に向きがあり、頂点Aから頂点Bへの一方向だけを結ぶグラフのことです。無向グラフと異なり、辺は一方通行と考えることができます。 問題を理解するための例 具体的な例を見てみましょう。始点を K、終点を P とした場合、出力は次のようになります。 K -> T -> Y -> A -> P K -> T -> Y -> P K -> A -> P こ

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:119/300  20-コンピューター/Page Goto:1 113 114 115 116 117 118 119 120 121 122 123 124 125