C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. 【C++】木構造を偶数ノードの森(フォレスト)に変換するアルゴリズムを解説

    このチュートリアルでは、木構造を「偶数個のノードを持つ木からなる森」に変換するプログラムをC++で実装する方法を解説します。N個のノードからなる木が与えられます。すべての連結成分(木)のノード数が偶数になるように辺を取り除いたとき、削除できる辺の最大数を求めるのが課題です。問題のポイントまず押さえておきたい重要な性質として、木全体のノード数が偶数である場合にのみ、すべての木が偶数ノードになるような森を作ることができます。奇数サイズの木は、どのように分割しても偶数サイズの木だけにすることはできないためです。解法のアプローチこの問題は深さ優先探索(DFS)を利用すると効率的に解けます。考え方は以下

  2. 【C++】ASCII値がkと互いに素な小文字だけを大文字に変換する方法

    このチュートリアルでは、与えられた文字列のうち、ASCII値が整数kと互いに素(coprime)である小文字のみを大文字に変換するC++プログラムについて解説します。問題の概要入力として、1つの文字列と1つの整数値kが与えられます。私たちのタスクは、文字列を先頭から順に走査し、各文字のASCII値がkと互いに素である場合に、その小文字を対応する大文字へ変換することです。それ以外の文字はそのまま維持します。互いに素であるかどうかの判定には、最大公約数(GCD)を利用します。ASCII値とkのGCDが1であれば、両者は互いに素であると判断できます。アルゴリズムのポイント各文字をint型にキャストし

  3. C++で括弧のバランスを判定する方法:スタックを使った有効な括弧チェック

    問題の概要 ある式が与えられたとき、その式に含まれる括弧が正しく対応している(バランスしている)かどうかを判定します。対象となる括弧は ()、{}、[] の3種類です。 例えば、「()[(){()}]」は開き括弧と閉じ括弧が正しい順序で対応しているため有効な式です。一方、「{[}]」は括弧の入れ子関係が崩れているため無効となります。 アルゴリズムの考え方:スタックを活用する この問題はスタック(stack)というデータ構造を使うことで、シンプルかつ効率的に解決できます。手順は以下の通りです。 式を先頭から最後まで走査する 現在の文字が開き括弧((、{、[)の場合 → スタックにプッシュす

  4. C++で階段の登り方の総数を求めるアルゴリズムを解説

    問題の概要n段の階段があり、ある人が1段目からn段目まで登ることを考えます。このとき「一度に登れる最大段数」も与えられます。これらの情報をもとに、n段目まで登る方法が何通りあるかを求めるのが本問題の目的です。例えば、一度に最大2段まで登れるとしましょう。この場合、漸化式を立てることで問題を解くことができます。n段目に到達するには、(n-1)段目から1段登るか、(n-2)段目から2段登るかのどちらかしかありません。したがって、次の漸化式が成り立ちます。ways(n) = ways(n-1) + ways(n-2)例として、階段が10段、一度に登れる最大段数が2段である場合、登り方の総数は89通り

  5. C++でパスカルの三角形を生成して表示する方法

    パスカルの三角形とは、二項係数(binomial coefficient)を三角形の形に整然と並べた数表のことです。最上段は n = 0 行目と定義され、各行内の要素は左端から k = 0 として番号が振られます。各数値は、直前の行に存在する2つの数、すなわち現在のセルの真上に位置する左右の値を足し合わせることで求められます。 また、パスカルの三角形は数学的には「n行目・k列目の値 = 二項係数 C(n, k)」として計算することもできます。つまり、組み合わせの公式 nCr(n, k) を用いて各セルの値を直接導出できるのです。 例えば、入力として 10 を与えた場合、出力は次のようになりま

  6. C++で多数派要素(マジョリティ要素)を判定する方法

    ソート済みの配列が与えられたとき、指定した数値 x がその配列の多数派要素(マジョリティ要素)であるかどうかを判定する問題を考えてみましょう。ある要素が配列の半分を超える回数(n/2 回より多く)出現するとき、その要素を多数派要素と呼びます。 7/2 が成り立ちます。したがって、答えは true(3 は多数派要素である)となります。アプローチ最もシンプルな方法は、配列内に x が出現する回数を数え、その回数が n/2 より大きければ true を、そうでなければ false を返すというものです。配列がソートされているため、arr[i] が x より大きくなった時点でループを早期に終了すること

  7. C++でExcelの列番号をアルファベット列名に変換する方法

    Excelの列番号はアルファベットで表現されます。Aから始まり、Zの次はAA、ABと続き、ZZの後はさらにAAA、AABへと進んでいきます。つまり、1列目が「A」、26列目が「Z」、27列目は「AA」という対応関係になります。本記事では、数値として与えられた列番号から、対応する列名(アルファベット)を求めるアルゴリズムをC++で解説します。例えば、列番号が80の場合、対応する列名は「CB」となります。 変換アルゴリズムの考え方 数値nが与えられたとき、まずnを26で割った余りを求めます。ここで処理の分岐が発生します。 余りが0の場合: その数値は26、52のように26の倍数に相当するため、出

  8. C++で階乗の末尾のゼロの個数を求める効率的なアルゴリズム

    階乗の末尾のゼロの個数を求めるにはこの記事では、任意の整数 n の階乗(n!)の結果に含まれる「末尾のゼロ」の個数を効率的に求める方法を解説します。例えば、n = 5 のとき 5! = 120 なので末尾のゼロは 1 個、20! = 2432902008176640000 なので末尾のゼロは 4 個になります。素朴な方法の問題点最も単純なアプローチは、階乗の値を実際に計算してからゼロの個数を数えることです。しかし、n が大きくなると階乗の値は爆発的に増大し、int 型や long long 型でもすぐにオーバーフローしてしまうため、この方法は実用性がありません。そこで、数学的な性質を利用した別

  9. C++で醜い数(Ugly Number)を求めるアルゴリズムと実装方法

    醜い数(Ugly Number)とは醜い数(Ugly Number)とは、素因数が2、3、5のみで構成される正の整数のことです。1から15までの範囲には、1、2、3、4、5、6、8、9、10、12、15の合計11個の醜い数が存在します。一方、7、11、13はそれ自体が素数であるため醜い数には該当しません。また、14は素因数に7を含むため、醜い数とはみなされません。例として、10番目の醜い数を求めると、その値は12になります。アルゴリズムの考え方この問題は、3つのインデックス(ポインタ)を使った動的計画法的なアプローチで効率よく解けます。すでに求めた醜い数に対して、それぞれ2倍、3倍、5倍した値

  10. C++で解く範囲合計クエリ(不変配列)― 累積和による効率的な実装

    整数の配列が与えられたとき、インデックス i から j までの範囲に含まれる要素の合計を求めることを考えます。この問題には2つの重要なポイントがあります。1つ目は、配列が不変(イミュータブル)であるため要素が一切変更されないこと、2つ目は、同じ種類のクエリが複数回実行されることです。そのため、大量のクエリが発生しても高速に処理できるよう、実行時間を考慮する必要があります。例えば、配列が A = [5, 8, 3, 6, 1, 2, 5] のとき、クエリ (A, 0, 3) に対する答えは 5 + 8 + 3 + 6 = 22 となります。解法のアプローチ:累積和(プレフィックスサム)この問題を

  11. C++でN番目のトリボナッチ数を計算する方法

    ある値 n が与えられたとき、n番目のトリボナッチ数(Tribonacci number)を求めることを考えます。トリボナッチ数はフィボナッチ数とよく似た数列ですが、フィボナッチ数が直前の2項の和で次の項を作るのに対し、トリボナッチ数では直前の3項の和を使って新しい項を生成します。T(n) を求める漸化式は以下のようになります。T(n) = T(n - 1) + T(n - 2) + T(n - 3)数列の最初の3項は {0, 1, 1} から始まります。アルゴリズムこの問題は、次のようなシンプルな反復処理で解くことができます。初期値として first := 0、second := 1、thi

  12. C++で曜日を求める方法|ツェラーの公式(Zeller's Algorithm)を徹底解説

    はじめに「日付(日・月・年)が与えられたとき、その日が何曜日なのかを求めたい」——プログラミングではよくある課題です。これを解決するのがツェラーの公式(Zellers Algorithm)です。本記事では、ツェラーの公式の計算方法と、C++での実装例をわかりやすく解説します。ツェラーの公式とはツェラーの公式を用いて曜日を求める計算式は以下の通りです。w = (d + ⌊13(m+1)/5⌋ + y + ⌊y/4⌋ + ⌊c/4⌋ + 5c) mod 7式に含まれる各変数の意味は次の通りです。d − 日付の「日」の部分。m − 月のコード。3月から12月まではそのまま3〜12を使用し、1月は13

  13. C++で等差数列から欠けた要素を二分探索で見つける方法

    等差数列の欠けている要素を見つける問題等差数列の要素が順番に並んだ配列があるとします。ただし、そのうち1つの要素だけが欠けています。この欠けている要素を見つけるのが本記事の課題です。例えば、arr = [2, 4, 8, 10, 12, 14] という配列の場合、6が欠けているため、出力は6になります。アルゴリズムの考え方:二分探索の活用この問題は二分探索(バイナリサーチ)を使うことで、効率的に解くことができます。手順は以下のとおりです。配列の中央の要素(mid)に注目します。中央の要素とその隣の要素(mid + 1)の差が、公差(diff)と一致しているかどうかを確認します。差が公差と異なる

  14. C++でソート済み・回転配列から最大要素を効率的に求める方法

    問題の概要 昇順にソートされた重複のない要素を持つ配列が、ある未知の位置で回転されているとします。この記事では、二分探索の考え方を活用し、O(log n) の計算量で配列内の最大要素を効率的に見つける C++ プログラムを紹介します。 例 たとえば、入力配列が {30, 40, 50, 10, 20} の場合、最大要素は 50 になります。 アルゴリズム 回転されたソート済み配列には、次のような重要な性質があります。最大要素は「隣接する次の要素が自分より小さい」という条件を満たす唯一の要素です。もし次の要素が自分より小さい要素が存在しなければ、配列は回転されていないことになり、最後の要素が最大

  15. C++とpthreadによるマルチスレッド処理で巨大な配列の最大値を高速に求める方法

    問題の概要非常に大きな整数型配列が与えられたとき、マルチスレッド処理を活用して配列内の最大値を効率的に求めます。データサイズが大きいほど、並列処理による高速化の効果は顕著になります。例入力配列が {10, 14, -10, 8, 25, 46, 85, 1673, 63, 65, 93, 101, 125, 50, 73, 548} の場合、この配列の最大要素は 1673 です。アルゴリズム配列のサイズを total_elements(総要素数)とします。N 個のスレッドを作成します。各スレッドは (total_elements / N) 個ずつの配列要素を担当し、その範囲内の最大値を求めます

  16. C++で配列の最大平衡和(イクリブリアム・サム)を求める方法

    問題概要配列 arr[] が与えられたとき、あるインデックス i における「接頭辞和(プレフィックスサム)」と「接尾辞和(サフィックスサム)」が一致する値の中から、最大値を見つけるのがこの問題の目的です。この一致する値は「平衡和(イクリブリアム・サム)」と呼ばれます。例入力配列が以下の場合を考えてみましょう。Arr[] = {1, 2, 3, 5, 3, 2, 1}このとき出力は 11 になります。その理由は次の通りです。接頭辞和 = arr[0..3] = 1 + 2 + 3 + 5 = 11接尾辞和 = arr[3..6] = 5 + 3 + 2 + 1 = 11インデックス 3 を境にし

  17. C++の基本データ型と派生データ型の違いを徹底解説

    プログラミングにおける「データ型」とは、ユーザーが扱おうとするデータの種類や性質を表す概念です。コンパイラやインタプリタは、このデータ型に基づいてデータを処理し、メインメモリ上に対応する格納領域を確保します。データ型は、その性質によって大きく2つに分類できます。1つは「基本データ型(Fundamental Data Type)」、もう1つは「派生データ型(Derived Data Type)」です。どちらもプログラミングで広く活用されており、ビジネスロジックをデータに対して実装する際には、どちらも同等に重要な役割を果たします。基本データ型と派生データ型の主な違い以下の表は、基本データ型と派生デ

  18. C++で回文に並べ替え可能な最大の偶数長部分文字列を求める方法

    問題の概要 文字列が与えられたとき、その中から「並べ替えると回文になる」部分文字列を探し、その最大の長さを求めるのがこの問題です。ただし、今回扱うのは偶数長の部分文字列に限られます。 具体例 入力文字列が「5432112356」の場合、答えは 6 になります。「321123」という部分文字列は並べ替えると「123321」という回文になり、その長さがちょうど 6 であるためです。 アルゴリズムの考え方 ある部分文字列が回文に並べ替えられるかどうかは、各文字の出現回数だけで判定できます。ポイントは次のとおりです。 奇数長の部分文字列は候補から除外する: 今回は偶数長のみを対象とするため、長さが奇

  19. C++でトーナメント優勝者がプレイできる最大試合数を求める方法

    問題文 N人のプレイヤーがトーナメントに参加しています。この問題では、優勝者がプレイできる最大の試合数を求める必要があります。ただし、このトーナメントには特別なルールがあり、2人のプレイヤーが対戦できるのは、それぞれがこれまでにプレイした試合数の差が1以内である場合のみです。 具体例 プレイヤーが3人の場合、優勝者を決めるには2試合が必要です。進行は以下のようになります。 第1試合:プレイヤー1 vs プレイヤー2 第2試合:プレイヤー3 vs 第1試合の勝者 アルゴリズムの考え方 まず「優勝者がx試合プレイするためには、最低何人のプレイヤーが必要か」という逆向きの問題を考えます。本題はそ

  20. C++で配列の値から構築できるピラミッド(三角形)の最大高さを求める方法

    問題概要整数の配列が与えられたとき、その配列の値を使って構築できるピラミッド(三角形)の最大の高さを求めます。ただし、ピラミッドは上の段から下の段に向かって、各段が直前の段よりも多くの要素を含み、かつ合計値も大きくなるように構成する必要があります。例入力配列が {40, 100, 20, 30} の場合、答えは 2 になります。最下段に 100 と 20 を配置し、その上の段に 40 または 30 のどちらか一方を置くことで、条件を満たす高さ 2 のピラミッドを作ることができます。アルゴリズムこの問題の解法は、シンプルな数学的性質に基づいています。高さ h のピラミッドを構築するためには、1

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