C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で「1つの数が他の2つの数の和として表せる」トリプレットを数える方法

    長さ n の整数型配列 Arr[] が与えられます。この記事の目標は、「任意の2つの数の和が残りの1つの数と等しくなる」ようなトリプレット (Arr[i], Arr[j], Arr[k]) の個数を求めることです。条件は a + b = c で表されます。ここで a、b、c は配列 Arr[] の要素であり、インデックス i、j、k は 0 <= i < j < k < n を満たします。この問題は、3重の for ループを使って解くことができます。arr[x] + arr[y] = arr[z] かつ x ≠ y ≠ z となる組み合わせが見つかるたびに、カウントを1

  2. C++で指定範囲内のMで割り切れる数を数える方法

    3つの整数 A、B、M が与えられます。A と B は数値の範囲 [A, B] を定義し、目的はこの範囲内に存在する M で割り切れる数の個数を求めることです。基本的な考え方は、i = A から順に最初の M の倍数まで走査し、i % M == 0 が成立するたびにカウントを増やしていくというものです。その後、i ≤ B である限り i を増加させながら同様の判定を繰り返します。具体例で確認してみましょう。入力例A=11, B=20, M=5出力指定範囲内でMで割り切れる数の個数: 2説明範囲 [11, 20] 内で 5 で割り切れる数は 15 と 20 のみです。したがって、答えは 2 とな

  3. C++で作成可能な三角形の個数を数える方法

    問題の概要 三角形の各辺の長さを格納した配列が与えられます。この記事の目標は、配列から任意の3つの値を選んで作ることができる三角形の個数を求めることです。 判定には、三角形の成立条件である「任意の2辺の和が、残りの1辺よりも大きい」ことを利用します。この条件を満たす3辺の組み合わせが見つかるたびに、カウントを1つずつ増やしていきます。 具体例を見ながら理解を深めましょう。 入出力例1 入力: arr[] = {1, 2, 4, 5} 出力: 作成可能な三角形の数 ― 1 説明: (2, 4, 5) の組み合わせだけが三角形を作れます。2+4>5、4+5>2、2+5>4 の

  4. C++で割り切れる関係にあるペア(i, j)の個数を数える方法

    N個の要素を持つ配列 arr[] が与えられたとします。この記事の目的は、「arr[i] が arr[j] で割り切れる」または「arr[j] が arr[i] で割り切れる」という条件を満たし、かつ i != j である有効なインデックスのペア (i, j) の総数を求めることです。これを実現するために、2重のforループを使って配列 arr[] を走査し、ペアごとに i != j のとき arr[i] % arr[j] == 0 または arr[j] % arr[i] == 0 が成り立つかどうかを確認します。条件が真であれば、ペアのカウントを1つ増やしていきます。それでは、具体例を見なが

  5. C++で列の合計が行の合計より大きいペアの個数を数える方法

    問題の概要N×N のサイズの行列が与えられたとき、「列 j の要素の合計が行 i の要素の合計よりも大きい」という条件を満たすインデックスのペア (i, j) の総数を求めるのが目標です。この問題は、行列を一度走査して各行・各列の要素の合計をあらかじめ計算しておくことで、効率よく解くことができます。まず、各行の要素の合計を配列 rowsum[N] に、各列の要素の合計を配列 colsum[N] にそれぞれ格納します。その後、rowsum[i] と colsum[j] のすべての組み合わせについて colsum[j] > rowsum[i] が成り立つかどうかを調べ、条件を満たすペアのカウ

  6. C++で数値Kを0未満に減らすために必要な操作回数を求める方法

    問題概要正整数Kと、整数を含む配列Ops[]が与えられます。この記事の目的は、Kが0未満になるまで減らすために必要な操作回数を求めることです。操作の手順は以下の通りです。最初の操作は「K + Ops[0]」。つまり、配列の先頭要素をKに加算します。その後、K < 0 になるまで Ops[i] をKに加算し続けます。インデックスiは循環的に変化し、0 ≤ i < N(NはOps[]の要素数)です。注意: K < 0 になるまで Ops[i] を加算し続けます。iが最後の要素 Ops[N-1] に達した場合は、再び i=0 からやり直します(循環方式)。解き方のポイントまず、配列

  7. C++の静的メンバー関数を使ってオブジェクトの生成数をカウントする方法

    本記事では、静的メンバー関数を使用して、クラスからいくつのオブジェクトが生成されたかをカウントする方法を解説します。静的データメンバーは、クラスのすべてのオブジェクトによって共有される特殊なメンバーです。明示的に値を指定しない場合、静的データメンバーは常に0で初期化されます。また、静的メンバー関数には、そのクラスの静的データメンバーのみを扱えるという重要な制約があります。ここではStudentクラスを例に取り上げます。オブジェクトの個数を保持するための静的データメンバー「count」を宣言し、静的メンバー関数「rollCall(void)」を定義します。この関数は、クラス内の学生の出席番号のよ

  8. C++で先頭と末尾の桁が同じ数字になる数を数える方法

    区間 [first, last] が与えられたとき、この範囲内で「先頭の桁」と「末尾の桁」が同じ数値がいくつ存在するかを求めるのが本記事の目的です。例えば 232 という数値は、先頭の桁も末尾の桁も 2 で一致しています。この問題は、i = first から i = last まで順番に走査することで解決できます。各数値について先頭の桁と末尾の桁を比較し、両者が一致していればカウントを1つずつ増やしていきます。それでは、具体的な例で確認してみましょう。入力 − first = 8, last = 40出力 − 先頭と末尾の桁が同じ数値の個数:5説明 − 8 から 40 の間で先頭と末尾の桁が同

  9. C++で偶数・奇数の積を持つ順序対の個数を数える方法

    正の整数からなる長さ n の配列が与えられたとき、arr[x] と arr[y] の積が偶数または奇数になる順序対 (arr[x], arr[y]) の個数を数えるのが本記事の目的です。なお、(arr[i], arr[j]) と (arr[j], arr[i]) は順序が異なるため、別々のペアとしてカウントします。計算方法はシンプルです。2重の for ループで配列を走査して各ペアを取り出し、その積を計算します。積が偶数であれば偶数積ペアのカウントを、奇数であれば奇数積ペアのカウントを、それぞれ2ずつ増やします((a, b) と (b, a) を別々に数えるため)。具体的な例で確認してみましょ

  10. C++で偶数・奇数の和を持つ順序対の個数を数える方法

    正の整数からなる長さnの配列が与えられます。この問題の目標は、arr[x]とarr[y]の和が偶数になるペア、および奇数になるペアのそれぞれについて、順序対(arr[x], arr[y])の個数を数えることです。なお、(arr[i], arr[j])と(arr[j], arr[i])は異なるペアとして数えます。解法では、2つのforループを使って配列を走査し、各ペアについて和を計算します。和が偶数であれば偶数和のカウントを2増やし、奇数であれば奇数和のカウントを2増やします。それでは、具体的な例で確認しましょう。例1入力: Arr[]= { 1,1,2,3 }、N=4出力: 偶数和のペア数 −

  11. C++でarr[i]*arr[j] > arr[i]+arr[j]を満たすペア(i, j)の個数を数える方法

    arr[i]+arr[j] かつ 0≦i<j<n を満たす順序付きペア(i, j)の個数を数えることです。ここで、nは配列内の要素数を表します。2つのforループを使って配列を走査し、各ペアについて調べていきます。それぞれのペアに対してarr[i]とarr[j]の和と積を計算し、積が和より大きければカウントを1つ増やします。具体例で確認してみましょう。入力 − Arr[]= { 1,1,2,3 } N=4出力 − ペアの個数 − 1説明 − 条件を満たす唯一のペアは(2,3)です。2*3=6 > 2+3=5入力 − Arr[]= { 2,2,2 } N=3出力 − ペアの個数 − 0説明 −

  12. 【C++】nで割り切れるm桁の整数の個数を求める方法

    はじめに2つの整数 m と n が与えられたとき、nで割り切れるm桁の整数の個数を求める問題をC++で解く方法を解説します。まず、m=1 の場合を考えてみましょう。このとき対象となる数は 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 の10個です。ここで n=3 とすると、3で割り切れる数は 0, 3, 6, 9 の4つとなるため、答えは4になります。具体例入力: m=2, n=9出力: nで割り切れるm桁の数の個数 = 10解説: 10から99の間で9の倍数となる数は以下の10個です。18, 27, 36, 45, 54, 63, 72, 81, 90, 99入力: m=3, n

  13. 【C++】指定した範囲内で一の位がkとなる数値の個数を数える方法

    区間 [first, last] が与えられたとき、その範囲内に存在する「一の位(1桁目)が k である数値」の個数を求める問題を考えます。最も基本的な解き方は、i = first から i = last まで順番に数値を調べていき、各数値 i の一の位を k と比較し、一致していればカウントを1つずつ増やすというものです。一の位は剰余演算(% 10)を使うことで簡単に取り出せます。具体的な例で確認してみましょう。入力例1入力: first=8, last=40, k=8出力: 一の位がkの数値の個数 → 4説明:8から40までの間で一の位が8の数値:8, 18, 28, 38入力例2入力:

  14. 【C++】N以下の数のうち平方数かつ立方数であるものを数える方法

    整数 N が与えられたとき、N 以下の数の中に「平方数(ある整数の2乗)」であり、かつ「立方数(ある整数の3乗)」でもある数がいくつ存在するかを求めるのが本記事のテーマです。たとえば、1 と 64 はどちらも平方数であると同時に立方数でもあります。判定には、平方根を計算する sqrt() と、三乗根を計算する cbrt() を利用します。まずは具体例で確認しましょう。入出力の例入力:N = 100出力:平方数かつ立方数である数の個数 ― 2説明:1 から 100 の範囲で、平方数かつ立方数でもあるのは 1 と 64 のみです。入力:N = 5000出力:平方数かつ立方数である数の個数 ― 4説

  15. C++でソート済み連続配列内の重複要素の出現回数を効率的に求める方法

    本記事では、連続する数値で構成される長さnの配列が与えられたとき、その中で唯一複数回繰り返されている要素が何回出現するかを求める方法を解説します。言い換えれば、配列内で繰り返されている要素の連続する長さ(出現回数)を求めることが目的です。配列はソートされており、要素が連続した値で並んでいるため、隣接する要素同士を比較するシンプルな線形走査で解決できます。具体的には、配列を i=0 から i<n まで順に走査し、arr[i] == arr[i+1] が成り立つたびにカウントを増やしていきます。最後に、最後の要素分としてカウントを1増やせば、それが繰り返し要素の出現回数となります。それでは、

  16. 【C++】1を加えることで2の累乗にできる数の個数を求める方法

    問題概要正の整数からなる配列が与えられます。求めたいのは、各要素に対して最大1回だけ「1を加える」という操作を行うことで、2の累乗にすることができる数の個数です。判定には log2(i) を活用します。2の累乗の対数は必ず整数になるため、floor(log2(i)) と ceil(log2(i)) が一致すれば、その数は2の累乗だと判断できます。この性質を使って、「そのまま2の累乗であるか」「1を加えれば2の累乗になるか」をチェックし、条件を満たすたびにカウントを増やしていきます。具体例で確認してみましょう。入出力例入力: arr[] = {1, 3, 2, 5, 6}出力: 2の累乗にできる

  17. 【C++】全要素の合計との絶対差がkより大きい要素の個数を求める方法

    問題の概要整数型の配列が与えられたとき、「配列全体の要素の合計とその要素自身との絶対差が変数 k より大きい」ような要素の個数を数えるのが本記事の目的です。解き方はシンプルです。まず配列内の全要素の合計 sum を求めます。そのうえで、各要素 arr[i] について次の条件を判定します。sum − 2 × arr[i] > ksum にはすでに arr[i] 自身が含まれているため、合計からその要素を2回引くことで「自分以外の要素の合計」との差を計算できます。この条件が真であればカウントを1つ増やします。具体例で理解する入力:arr[] = { 1, 2, 3, 0, 3, 2, 0,

  18. C++でグラフ内のどのエッジにも含まれないノード数を最大化する方法

    ノードとエッジから構成されるグラフが与えられたとき、どのエッジにも接続されていないノードの最大数を求めるのがこの問題の目的です。完全グラフにおいては、ノード数は常にエッジ数以下になるという性質があります。 この問題は、完全グラフの性質を利用することで効率的に解くことができます。ノード数がnの完全グラフにおけるエッジ数は、次の式で表されます。 edge = n(n-1)/2 (nはノード数) 2 × edge = n(n-1) n(n−1) の値が実際のエッジ数(2×edge)を超えた時点で、その分のノードは「余分」、つまりどのエッジにも使われていないことになります。そこで、i=1から順に i

  19. C++で指定された合計値となる4つ組の個数を求める方法

    問題概要 4つの整数型配列が与えられます。それぞれの配列から1つずつ要素を選んで作られる「4つ組(クアドラプレット)」のうち、その合計が指定された値(Sum)と一致するものが何通りあるかを求めるのが目的です。ポイントは、選んだ4つの要素が必ず異なる配列に属していなければならないという点です。 最もシンプルな解法は、4重のforループですべての組み合わせを走査し、A[i] + B[j] + C[k] + D[l] == sum が成立するたびにカウントを増やしていく全探索です。 入出力例 例1 入力: A[]={ 1,3,1 }, B[]={ 2,4,5 }, C[]={ 1,1,2 }, D

  20. C++でバイナリ文字列内の偶数となる10進値の部分文字列を数える方法

    0と1のみで構成された文字列が与えられます。この文字列は、左から右に読む2進数を表しており、たとえば「001」は1ではなく4を意味します。今回の目的は、10進数として偶数の値を表すすべての部分文字列を見つけることです。この問題は、各部分文字列の先頭の値を確認するだけで解決できます。先頭が0であればその数は偶数になり、1であれば奇数になります。str[0]=0で始まるすべての部分文字列は10進数で偶数となるため、countに(length - i)を加算していきます。具体例を使って理解しましょう。入力 − str=101出力 − バイナリ文字列における偶数の10進値を持つ部分文字列の数 − 2説

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:213/300  20-コンピューター/Page Goto:1 207 208 209 210 211 212 213 214 215 216 217 218 219