C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で同じ文字が隣接しないように文字列を再配置する方法

    任意の長さの文字列 str が与えられたとします。この課題では、結果として得られる文字列の中に同じ文字が隣り合って現れないように、与えられた文字列を再配置することを目指します。 入出力シナリオの例 入力 − string str = itinn 出力 − 隣接する2文字が同じにならないように文字を再配置した結果:initn 説明 − 文字列型の変数 str が与えられています。入力文字列に含まれる「nn」のように同じ文字が隣り合っている部分を入れ替えるなど、同じ文字が連続しないように文字を再配置します。その結果、最終的な文字列は「initn」になります。 入力 − string str = a

  2. C++でリファクタラブル数(Refactorable Number)を判定する方法

    リファクタラブル数とは?整数型の値(ここでは number とします)が与えられ、その数が「リファクタラブル数(Refactorable Number)」かどうかを判定するのが本記事の課題です。リファクタラブル数であれば「リファクタラブル数です」と出力し、そうでなければ「リファクタラブル数ではありません」と出力します。ある数が、その約数の総数で割り切れるとき、その数はリファクタラブル数と呼ばれます。例えば、9 は約数が3つ(1、3、9)あり、9 は 3 で割り切れるため、リファクタラブル数です。入出力のシナリオ例入力 − int number = 9出力 − リファクタラブル数です説明 − 9

  3. C++で余分なメモリ領域を使わずに行列を時計回りに90度回転する方法

    2次元配列から構成される行列が与えられたとき、その行列を時計回りに90度回転させるのが課題です。回転後は、最後の行が最初の列へ、2番目の行が2番目の列へ、最初の行が3番目の列へと移動します。さらに難しい条件として、余分なメモリ領域(補助配列)を一切使用しないことが求められます。入出力シナリオの例例1入力:int arr[row_col_size][row_col_size] = { { 5, 1, 4}, { 9, 16, 12 }, { 2, 8, 9}}出力:余分なメモリ領域を使わずに行列を時計回りに90度回転した結果: 2 9 5 8 16 1 9 12 4解説: 整数型

  4. C++で余分な領域を使用せずに行列を90度回転する方法

    2次元配列から形成される行列が与えられ、それを追加のメモリ領域(extra space)を一切使わずに90度回転させることが課題です。ここでは時計回りの回転を扱い、回転後には最初の行が最後の列へ、2番目の行が後ろから2番目の列へ、というように行と列が入れ替わります。この問題の難しい点は、補助配列を作らず、元の配列の中だけで要素を入れ替える「インプレース処理」で完結させることにあります。 入出力のシナリオ 入力 − int arr[row_col_size][row_col_size] = { { 5, 1, 4}, { 9, 16, 12 }, { 2, 8, 9}} 出力

  5. C++で再帰を使って単語リストの組み合わせから作れるすべての文を出力する方法

    単語リストが与えられたとき、再帰的なアプローチを用いて各リストから1つずつ単語を選び、生成できるすべての文の組み合わせを出力することを目標とします。各リストから一度に選べる単語は1つだけというルールです。入出力シナリオの確認例1入力 −sentence[row][col] = {{I, You}, {Do, do not like}, {walking, eating}}出力 −I Do walking I Do eating I like walking I like eating You Do walking You Do eating You like walking You

  6. C++で数値を繰り返し連結して形成した数の桁の再帰的合計を求める方法

    整数「number」と「repeat」の2つが入力として与えられます。この問題の目的は、入力された数値を「repeat」回繰り返し連結して形成した新しい数値に対して桁の合計を計算し、その結果が1桁になるまで同じ操作を繰り返すことです。 例えば、number=123、repeat=2 の場合、123を2回連結した「123123」の桁の合計は 1+2+3+1+2+3=12 となります。12はまだ2桁の数値なので、さらに桁の合計を計算すると 1+2=3 となります。3は1桁の数値であるため、最終的な出力は 3 になります。 入出力シナリオの例 入力 − number=32, repeat=3 出力

  7. C++で数値の桁の再帰的な合計が素数かどうかを判定する方法

    整数変数 number を入力として受け取り、その各桁の合計を計算して、合計値が素数かどうかを判定する問題について解説します。この処理は、桁の合計が一桁になるまで繰り返され、最終的に得られた一桁の数値が素数であるかどうかを確認します。たとえば、入力が 123 の場合、桁の合計は 1+2+3=6 となり、6 は素数ではないため、結果は「素数ではない」となります。 入出力シナリオの例 入力 − number = 12341 出力 − 桁の再帰的な合計は素数(PRIME) 説明 − 1+2+3+4+1 = 111+1 = 22 は素数です。 入力 − number = 1664 出力 − 桁の再帰

  8. C++でマージソートツリーを実装して範囲クエリを高速化する

    整数配列、セグメントの開始・終了インデックス、キー値 k が与えられたとき、指定された範囲内で k 番目に小さい要素 を効率的に求める問題を解説します。この問題は「マージソートツリー(Merge Sort Tree)」と呼ばれるデータ構造を用いると、クエリごとに O(log² N) で処理できます。 問題の理解:具体例で確認 例 1 入力配列: arr[] = {7, 8, 1, 4, 6, 8, 10} クエリ 1: start = 2, end = 4, k = 2 → 範囲 [8, 1, 4] で 2 番目に小さい値 クエリ 2: start = 1, end = 6, k = 3

  9. C++でマルチスレッドを使ってマージソートを実装する方法

    本記事では、ソートされていない整数型配列が与えられたとき、マルチスレッドを活用したマージソート(Merge Sort)で配列を並べ替える方法を解説します。マージソートとはマージソートは「分割統治法(Divide and Conquer)」に基づくソートアルゴリズムです。配列を半分ずつに分割していき、最後にそれらを整列させながら統合(マージ)することで、全体を昇順に並べ替えます。マージソートのアルゴリズムリスト内の要素が1つだけなら、その要素をそのまま返します。そうでなければ、データを再帰的に2つに分割し、それ以上分割できなくなるまで繰り返します。最後に、小さなリスト同士を整列順に保ちながら新し

  10. C++でN番目の非平方数を求める方法を解説

    2、3、5、7、8のように、ある整数の2乗にはならない数(非平方数)は身近にたくさん存在します。しかし非平方数は無限にあるため、そのすべてを把握することはできません。この記事では、非平方数とは何かを丁寧に解説し、C++でN番目の非平方数を求める具体的な方法を紹介します。 N番目の非平方数とは ある数が別の整数の2乗で表せるとき、その数は完全平方数と呼ばれます。完全平方数の例は以下の通りです。 1 は 1 の2乗 4 は 2 の2乗 9 は 3 の2乗 16 は 4 の2乗 25 は 5 の2乗 一方、どの整数の2乗にもならない数を非平方数と呼びます。最初の15個の非平方数は次のようになります

  11. C++で各桁がすべて奇数となるN番目の数を効率的に求める方法

    C++には数学的な問題を解決するための豊富な関数群が用意されています。その中でも、各桁がすべて奇数で構成される数列の中からN番目の数を求めるというのは、興味深い数学的課題の一つです。この記事では、奇数とは何か、そして「各桁がすべて奇数である数」とはどのような数なのかを理解した上で、N番目の数を求めるための完全なアプローチを解説します。 各桁がすべて奇数で構成されるN番目の数を求める まず基本のおさらいです。奇数とは2で割ると余りが1になる数のことで、小さい順に並べると 1, 3, 5, 7, 9, 11, 13, 15, 17, 19... となります。 ここで求めたいのは「各桁の数字がすべて

  12. C++でK分木における重みWのパスの数を求める方法

    この記事では、C++を使ってK分木(K-ary tree)における重みWのパスの数を計算する方法を解説します。K分木とは、各ノードがK個の子を持つ木構造のことであり、各エッジには重みが割り当てられています。あるノードからそのすべての子へ伸びるエッジの重みは、1からKまでの値を順に取ります。今回求めたいのは、根(ルート)から始まるパスのうち、重みの合計がWに等しく、かつ重みM以上のエッジを少なくとも1つ含むパスの総数です。以下に具体例を示します。入力 : W = 4, K = 3, M = 2 出力 : 6この問題では、動的計画法(DP)を活用することで、時間計算量と空間計算量を大幅に削減でき

  13. C++とオイラー特性でサッカーボールの五角形・六角形の数を求める方法

    サッカーボールをよく見ると、黒い五角形と白い六角形がパズルのように組み合わさり、完璧な球体を形作っていることがわかります。本記事では、オイラー特性(Euler characteristic)という数学的手法を用いて、サッカーボール上に存在する五角形と六角形の数を求める方法を解説し、最後にC++での実装例も紹介します。 オイラー特性とは オイラー特性とは、位相空間における図形や構造の特徴を表す数値です。球面の場合、オイラー特性は常に2になることが知られており、この性質を利用することで、サッカーボール上の五角形と六角形の数を計算できます。 オイラー特性では、以下の要素を使用します。 χ(S) —

  14. C++でちょうどK個の転倒(インバージョン)を持つ順列の数を求める方法

    問題概要配列において、a[i] > a[j] かつ i < j を満たすペア (a[i], a[j]) のことを「転倒(インバージョン)」と呼びます。この問題では、2つの整数 N と K が与えられ、1から N までの数を使った順列のうち、転倒数がちょうど K に一致するものが何通り存在するかを求めます。例入力:N = 4, K = 1出力:3説明:1〜4の順列には 1234, 1243, 1324, 2134 などがあります。このうち転倒が1つだけのものは 1243, 1324, 2134 の3通りです。入力:N = 3, K = 2出力:3説明:1〜3の順列は 123, 132

  15. C++で直角三角形を形成できる斜辺と面積のペアの数を求める方法

    この記事では、C++を使って、直角三角形を形成できる「斜辺」と「面積」の組み合わせが何通りあるかを求める方法を解説します。 問題の概要 与えられた斜辺 H と面積 A の組み合わせ (H, A) のうち、「H を斜辺、A を面積とする直角三角形」が実際に存在するものの総数を求めます。 ここで、各変数を次のように定義します。 x:直角三角形の底辺 y:直角三角形の高さ H:直角三角形の斜辺 数学的な導出 直角三角形の面積は次の式で表せます。 A = ( x × y ) / 2 両辺を変形すると、 4 × A2 = ( x × y )2 … (1) また、三平方の定理(ピタゴラスの定理)より、

  16. C++で指定範囲クエリ内の累積和(プレフィックス合計)に含まれる素数の個数を求める方法

    問題概要この記事では、正の整数からなる配列 arr[ ] と範囲クエリ L、R が与えられたとき、累積和(プレフィックス合計)配列の中に素数がいくつ存在するかを求める方法を解説します。L は累積和の計算を始める配列の開始インデックス arr[L]、R は計算を終えるインデックスです。累積和配列を作成するには、インデックス L から R まで順番に走査し、元の配列の現在の値に直前の累積和を加えていきます。以下に具体例を示します。入力 : arr[ ] = { 3, 5, 6, 2, 4 }L = 1, R = 3出力 : 3説明 : prefixsum[ 0 ] = arr[ L ] = 5pr

  17. C++で配列内の素数ペアの個数を効率的に求める方法

    この記事では、C++を使って配列内に存在する素数ペアの個数を求める方法について、基礎から応用まで詳しく解説します。整数型の配列 arr[] が与えられ、その中から作れるすべての素数ペアを数えるのが目的です。まず、問題の具体例を見てみましょう。入力 : arr[ ] = { 1, 2, 3, 5, 7, 9 } 出力 : 6 配列から作れる素数ペアは以下の6通り (2, 3), (2, 5), (2, 7), (3, 5), (3, 7), (5, 7) 入力 : arr[] = {1, 4, 5, 9, 11} 出力 : 1解法のアプローチ総当たり(ブルートフォース)法最初に紹介するの

  18. C++で部分配列に含まれる素数の個数を効率的に求める方法

    本記事では、部分配列(サブアレイ)内に含まれる素数の個数を求める方法を解説します。正の整数からなる配列 arr[] と、範囲 {L, R} を指定する q 個のクエリが与えられ、それぞれのクエリに対して指定された範囲内に存在する素数の個数を出力する必要があります。まず、問題の具体例を見てみましょう。入力:arr[] = {1, 2, 3, 4, 5, 6}、q = 1、L = 0、R = 3出力:2指定された範囲内の素数は {2, 3} の2個です。入力:arr[] = {2, 3, 5, 8, 12, 11}、q = 1、L = 0、R = 5出力:4指定された範囲内の素数は {2, 3,

  19. C++で与えられた点から作成できる四角形の数を求める方法

    四角形とは? 四角形(クアドララテラル)とは、ユークリッド平面上で4つの頂点と4つの辺を持つ多角形のことを指します。「4-gon」という呼び方もあり、正方形や長方形なども四角形の一種に含まれます。 本記事では、与えられた点から作成できる四角形の数を求める手法について解説します。この問題では、直交座標系(XY平面)上に与えられた4つの点 (x, y) を用いて、いくつの四角形を構成できるかを求めます。まず、具体的な入力例と出力例を見てみましょう。 入力 : A( -2, 8 ), B( -2, 0 ), C( 6, -1 ), D( 0, 8 ) 出力 : 1 説明 : 作成できる四角形は1つだ

  20. 【C++】最初の3項が等差数列・最後の3項が等比数列になる4つ組の個数を求める方法

    この記事では、最初の3項が等差数列(A.P.)、最後の3項が等比数列(G.P.)を満たす4つ組の個数を求めるためのさまざまなアプローチを詳しく解説します。まずは、等差数列と等比数列の基本的な定義から見ていきましょう。 等差数列(A.P.)とは 等差数列とは、隣り合う2つの項の差(公差 d)が常に一定である数列のことです。つまり、連続する2つの数の差が常に同じになります。例:1, 3, 5, 7, 9(公差 d = 2) 等比数列(G.P.)とは 等比数列とは、隣り合う2つの項の比(公比 r)が常に一定である数列のことです。各項は、前の項に固定の数を掛けることで求められます。例:3, 6, 12

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:275/300  20-コンピューター/Page Goto:1 269 270 271 272 273 274 275 276 277 278 279 280 281