C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. 【C++】n番目のペル数を求める方法|再帰・反復の2つの実装を解説

    ペル数とは 本記事では、整数 n が与えられたときに、その位置にあるペル数 Pn を求める問題を解説します。 ペル数とは、次の漸化式で定義される数列のことです。 Pn = 2 × Pn-1 + Pn-2 最初の2項は以下のように定められています。 P0 = 0 P1 = 1 この定義に従うと、数列は「0, 1, 2, 5, 12, 29, 70, …」と続いていきます。 解法のアプローチ この問題は、大きく分けて再帰と反復(ループ)の2つの方法で解くことができます。それぞれ順番に見ていきましょう。 方法1: 再帰を使うアプローチ 漸化式をそのまま関数として表現し、自分自身を呼び出しながら

  2. C++でN番目の五角錐数を求める方法を解説

    五角錐数とは五角錐数(Pentagonal Pyramidal Number)とは、五角形を底面として積み上げたピラミッドに含まれる物体の総数を表す数です。まず、下図のようにいくつかの五角数を確認してみましょう。1からNまでの五角数の総和は、N番目の五角錐数と一致します。この記事では、N番目の五角錐数を求める方法について詳しく解説します。入力:N = 4出力:40説明:最初の4つの五角数 1, 5, 12, 22 の合計は 40 です。入力:N = 6出力:126説明:最初の6つの五角数 1, 5, 12, 22, 35, 51 の合計は 126 です。解法へのアプローチシンプルなアプローチ上

  3. 【C++】配列のインデックス範囲[L, R]におけるビットANDクエリを効率的に処理する方法

    この記事では、「整数の配列と複数のクエリが与えられ、各クエリに対してインデックス範囲 [L, R] 内の要素すべてのビットごとのAND(論理積)を求める」という問題を扱います。まずは例を見てみましょう。 入力: arr[] = {1, 3, 1, 2, 32, 3, 3, 4, 4}、q[] = {{0, 1}, {3, 5}} 出力: 1 (1 AND 3 = 1) 0 (32 AND 3 AND 4 = 0) 入力: arr[] = {10, 10, 12, 16, 8}、q[] = {{0, 2}, {3, 4}} 出力: 8 0 最初にブルートフォース(

  4. C++で配列の指定範囲[L, R]におけるビット単位ORクエリを高速に処理する方法

    この記事では、整数の配列が与えられたとき、指定されたインデックス範囲 [L, R] 内に存在するすべての数値のビット単位OR(論理和)を求める問題を解説します。入力: arr[] = {1, 3, 1, 2, 3, 4}, q[] = {{0, 1}, {3, 5}} 出力: 3 7 1 OR 3 = 3 2 OR 3 OR 4 = 7 入力: arr[] = {1, 2, 3, 4, 5}, q[] = {{0, 4}, {1, 3}} 出力: 7 7まずはシンプルな全探索(ブルートフォース)から取り組み、その計算量が大きな制約に対しても通用するかを検証します。通用しない場合は、より効率的

  5. C++で解く「以上」と「より大きい」のクエリ処理:二分探索による効率化

    問題概要 本記事で扱うのは、配列が与えられたときに次の2種類のクエリに答える問題です。 タイプ0 ― x(指定された値)以上の要素がいくつあるかを求める。 タイプ1 ― xより大きい要素がいくつあるかを求める。 具体例を見てみましょう。 入力 : arr[] = { 10, 15, 30, 40, 45 }、Q = 3 クエリ1 : 0 50 クエリ2 : 1 40 クエリ3 : 0 30 出力 : 0 1 3 説明 : x = 50, q = 0 : 50以上の要素は存在しない。 x = 40, q = 1 : 45 が 40 より大きい

  6. C++で解く:範囲内のK番目のビットがセットされた配列要素の数を求めるクエリ処理

    はじめに 本記事では、指定された範囲内に存在する要素のうち、K番目のビットがセット(1)になっている要素の個数を求める問題について解説します。まずは具体例を見てみましょう。 入力 : arr[] = { 4, 5, 7, 2 } クエリ1: L = 2, R = 4, K = 4 クエリ2: L = 3, R = 5, K = 1 出力 :     0     1 まずは総当たり(ブルートフォース)のアプローチでこの問題を解き、その手法が大きな制約値に対しても実用的かどうかを確認します。もし不十分であれば、より効率

  7. C++でnのすべての約数を出力するクエリ処理の実装方法

    この記事では、与えられた整数 n のすべての約数を出力する問題を解説します。入力:15 出力:1 3 5 15 説明 15の約数は 1、3、5、15 です。 入力:30 出力:1 2 3 5 6 10 15 30この問題では、エラトステネスの篩(ふるい)で使われる考え方を応用することで、n の約数を効率的に求めることができます。複数のクエリに対して高速に答えたい場合に特に有効な手法です。解決のためのアプローチここでは、エラトステネスの篩と同じ発想を用いて、あらかじめ各整数の約数をまとめて計算しておく方法を紹介します。事前に約数リストを作成しておけば、クエリが来たときは即座に答えを返すだけで済

  8. C++で解く更新なしの区間和クエリ:累積和による効率的な手法

    この記事では、サイズnの整数型配列が与えられたとき、インデックスLからRまでの要素の合計を求めるクエリを複数回処理する問題を扱います。つまり、指定された区間 [L, R] の合計を計算する必要があります。以下に具体例を示します。入力 : arr[] = {1, 2, 3, 4, 5}     L = 1, R = 3     L = 2, R = 4 出力 : 9     12 入力 : arr[] = {1, 2, 3, 4, 5}    &

  9. C++で配列内の全要素のランクを求める方法|総当たり法と効率的なアルゴリズムを解説

    この記事では、配列内のすべての要素にランク(順位)を割り当てる問題を扱います。最も小さい数値には最小のランクを、最も大きい数値には最大のランクを付与します。さらに、同じ値が複数回出現する場合は、その出現頻度に応じてランクを調整する必要があります。問題の例入力 : 20 30 10 出力 : 2.0 3.0 1.0 入力 : 10 12 15 12 10 25 12 出力 : 1.5, 4.0, 6.0, 4.0, 1.5, 7.0, 4.0上記の2つ目の例では、値「10」のランクが「1.5」になっています。これは、配列内に「10」が2つ存在するためです。もし両者が異なるランク(1と2)を取る

  10. C++でソート済み配列を最大・最小交互の形式に並べ替える方法

    問題の概要 ソート済みの配列が与えられます。この配列を「最大・最小形式」に並べ替えることが求められます。具体的には、1番目の要素が最大値、2番目の要素が最小値、3番目の要素が2番目に大きい値、4番目の要素が2番目に小さい値、というように交互に配置していきます。以下に例を示します。 入力 : arr[ ] = { 10, 20, 30, 40, 50, 60 } 出力 : { 60, 10, 50, 20, 40, 30 } 説明 : 配列は「1番目の最大値、1番目の最小値、2番目の最大値、2番目の最小値、3番目の最大値、3番目の最小値」という順序で並べ替えられます。 入力 : arr[ ]

  11. C++で学ぶ配列の並べ替え – 最小値・最大値・2番目に小さい値・2番目に大きい値を交互に配置する方法

    配列が与えられたとき、最初の要素を最小値、2番目の要素を最大値、3番目の要素を2番目に小さい値、4番目の要素を2番目に大きい値…というように、小さい値と大きい値を交互に並べ替えることを考えます。具体例は以下のとおりです。 入力 : arr[ ] = { 13, 34, 30, 56, 78, 3 } 出力 : { 3, 78, 13, 56, 34, 30 } 説明 : 配列は { 1番目に小さい値, 1番目に大きい値, 2番目に小さい値, 2番目に大きい値, 3番目に小さい値, 3番目に大きい値 } の順に並べ替えられます 入力 : arr[ ] = { 2, 4, 6, 8, 11, 1

  12. C++でi×arr[i]の合計を最大化する配列の並べ替えアルゴリズム

    この記事では、n個の数値からなる配列を並べ替える問題について解説します。配列から要素を選択していく際、各要素を選ぶたびに「現在の要素の値 × それまでに選択した要素の個数」で計算されるポイントを獲得できます。このとき、獲得できるポイントの合計が最大になるように要素を選択するのが目的です。 問題の例 入力 : arr[ ] = { 3, 1, 5, 6, 3 } 配列が与えられた順番のまま要素を選択した場合、ポイントは  = 3 × 0 + 1 × 1 + 5 × 2 + 6 × 3 + 3 × 4  = 41 ポイントを最大化するには、{ 1, 3, 3, 5, 6 } の順に要素を選択し

  13. C++を使って文字列から特定の単語を削除する方法

    本記事では、与えられた文字列から指定した単語を削除する問題を解説します。まず、具体的な例を見てみましょう。入力 : str = remove a given word, word = remove 出力 : a given word 入力 : str = god is everywhere, word = is 出力 : god everywhere解決のためのアプローチ文字列から特定の単語を削除するには、シンプルな手法を用いることができます。手順は以下の通りです。まず、与えられた文字列を2次元配列(マトリックス)形式に変換し、各行に1つの単語を格納します。マトリックス内から対象の単語を検索

  14. 連結リストのK番目のノードをすべて削除する方法を解説

    はじめにこの記事では、連結リスト(リンクリスト)のK番目のノードをすべて削除する方法を解説します。具体的には、kの倍数にあたる位置、つまりk番目、2k番目、3k番目……にあるノードを順番に削除していきます。入力 : 112->231->31->41->54->63->71->85 k = 3出力 : 112->231->41->54->71->85説明 : k = 3 のため、3番目のノードを削除します。1回目の削除後 : 112->231->41->54->63->71->85次

  15. C++で連結リスト(リンクリスト)の先頭ノードを削除する方法

    連結リスト(リンクリスト)が与えられたとき、その最初の要素を削除し、新しいリストの先頭(head)へのポインタを返すプログラムを作成します。Input : 1 -> 2 -> 3 -> 4 -> 5 -> NULL Output : 2 -> 3 -> 4 -> 5 -> NULL Input : 2 -> 4 -> 6 -> 8 -> 33 -> 67 -> NULL Output : 4 -> 6 -> 8 -> 33 -> 67 -> NULLこの問題では、リストの最

  16. C++で連結リストの末尾ノードを削除する方法

    片方向連結リストが与えられ、そこから末尾のノードを削除するのが本記事のテーマです。この問題は、与えられたリストを先頭から順に走査し、最後のノードを取り除くだけで解決できます。 解決のためのアプローチ このアプローチでは、リストを走査しながら「直前のノード(prev)」と「現在のノード(curr)」を常に追跡します。そして、現在のノードが末尾ノードに到達した時点で、prev->next を NULL に設定し、curr のメモリを解放します。 実装例 #include <iostream> using namespace std; struct Node { int

  17. C++で配列の先頭にあるゼロ(先行ゼロ)を削除する方法

    この記事では、与えられた配列から先頭のゼロ(先行ゼロ)を取り除き、その結果を出力する方法を解説します。問題の概要たとえば、次のような入力と出力を考えます。入力 : arr[] = {0, 0, 0, 1, 2, 3} 出力 : 1 2 3 入力 : arr[] = {0, 0, 0, 1, 0, 2, 3} 出力 : 1 0 2 3ご覧のとおり、配列の途中にあるゼロはそのまま残し、先頭に連続して並ぶゼロだけを削除するのがポイントです。解決のアプローチ基本的な方針はシンプルです。配列を先頭から走査し、最初の「ゼロではない要素」の位置を見つけることで、そこより前のゼロをすべて除外した新しい配列を

  18. C++で数値内の連続する重複桁を削除する方法

    この記事では、数値 n が与えられたとき、その中に含まれる連続する重複桁を削除する方法を解説します。入力: x = 12224 出力: 124 入力: x = 124422 出力: 1242 入力: x = 11332 出力: 132ご覧のとおり、隣り合って繰り返されている桁だけが削除され、離れた位置にある同じ数字はそのまま残ります。この問題では、数値のすべての桁を走査しながら、重複している桁を取り除いていきます。解決のためのアプローチこのアプローチでは、n の各桁を右から左へ順番に調べていきます。具体的には、n を 10 で割った余り(n % 10)で最下位の桁を取り出し、その後 n を

  19. C++で2つの0に挟まれた要素を削除する方法をわかりやすく解説

    この記事では、「0」と「1」のみで構成される文字列が与えられたとき、2つの「0」に挟まれた「1」をすべて削除する方法を解説します。最終的な文字列には、「0」に囲まれた「1」が一切残らない状態を目指します。問題の例入力 : string = 110010 出力 : 11000 説明 : インデックス4にある「1」が、前後の2つの「0」に挟まれているため削除されます。 入力 : string = 0010 出力 : 000 説明 : インデックス2にある「1」が、2つの「0」に挟まれているため削除されます。解決のためのアプローチここではシンプルなアプローチを採用します。ループを使って文字列を先頭

  20. 【C++】Nで割り切れるレピュニット(繰り返し単位)の最小桁数を効率的に求める方法

    はじめに 本記事では、指定された整数Nで割り切れる「レピュニット(繰り返し単位)」の桁数kを求める問題について解説します。レピュニットとは、数字の1のみが繰り返される数のことで、R(k)は1がk個並んだ数を表します。例えば、R(4) = 1111 となります。ここでの課題は、R(k)がNで割り切れるような最小のkを求めることです。 入力 : N = 13 出力 : k = 6 説明 : R(6)、つまり 111111 は 13 で割り切れます。 入力 : N = 31 出力 : k = 15 解法へのアプローチ この問題に対する最も素朴なアプローチは、k = 1から順に各値をチェックし、R(

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:280/300  20-コンピューター/Page Goto:1 274 275 276 277 278 279 280 281 282 283 284 285 286