C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. 【C++】合計がSかつXORがKとなる正の整数の順序対をカウントする方法

    2つの整数 S(合計)と K(XOR)が与えられたとき、「合計が S になり、XOR(排他的論理和)が K になる正の整数の順序対」がいくつ存在するかを求めるのが、この問題のゴールです。ここでいう順序対(ordered pair)とは、(i, j) と (j, i) を互いに異なるペアとして区別して数えることを意味します。そのため、同じ2つの数の組み合わせでも、並び順が違えば別々にカウントされます。問題を解く基本的な考え方アプローチはとてもシンプルです。i を 1 から順に動かしながら、各 i に対して j = i + 1 以降の値を順番に試していきます。そして、ペア (i, j) が次の2つ

  2. C++で積がN未満となる順序対の個数をカウントする方法

    問題概要 整数 N が与えられたとき、2つの正の整数からなる順序対(ペア)のうち、その積がN未満になるものをすべて数え上げることを目標とします。 この問題は、i を 1 から N 未満まで、j を 1 から i*j < N を満たす範囲まで動かしながら、条件を満たす組み合わせの数をカウントしていくことで解けます。 具体的な例で確認してみましょう。 入力例 1 N=4 出力例 1 Ordered pairs such that product is less than N: 5 説明 Pairs will be (1,1) (1,2) (1,3) (2,1) (3,1) 積が4未満となる

  3. C++で三乗の和がN(a³+b³=N)となるペア(a, b)の個数を数える

    問題の概要 整数Nが与えられたとき、三乗の和がNに等しくなるような正数の順序付きペア(a, b)をすべて見つけ、その個数を求めるのが目標です。 これは、方程式 a3 + b3 = N の解を探索することで実現できます。aはNの立方根以下の範囲で調べ、対応するbは (N − a3) の立方根として計算できます。 具体例で確認しましょう。 入力  N=35 出力  a^3+b^3=Nとなるペア(a,b)の個数: 2 説明  ペアは(2,3)と(3,2)。2^3+3^3=8+27=35 入力  N=100 出力  a^3+b^3=Nとなるペア(a,

  4. C++で二乗和がN(a² + b² = N)となるペア(a, b)を数える方法

    整数 N が与えられたとき、「二乗の和が N になるような正の整数の順序付きペア(a, b)」をすべて見つけ出し、その個数を数えるのが本記事の目的です。 この問題は、方程式 a2 + b2 = N の解を探索することで解決できます。具体的には、a を 1 から √N までの範囲で順に調べ、それぞれの a に対して b を √(N − a2) として計算します。b がきれいな整数になれば、そのペアは条件を満たしていることになります。 それでは、具体例を使って理解していきましょう。 入力例 1 N = 100 出力例 1 a^2 + b^2 = N となるペア(a, b)の個数: 2 説明 該当す

  5. C++で(i+j)がAとBの両方で割り切れる順序対(i, j)の個数を数える方法

    問題概要整数 N、M、A、B が与えられます。求めるのは、その和が A と B の両方で割り切れる正の整数の順序対 (i, j) の個数です。ここで、1 ≤ i ≤ N および 1 ≤ j ≤ M を満たすものとします。解法としては、i と j について二重ループで全探索を行い、(i+j) % A == 0 かつ (i+j) % B == 0 が成立するたびにカウントを1ずつ増やしていきます。具体例で確認してみましょう。入力N = 5, M = 10, A = 2, B = 3;出力(i+j) が A と B の両方で割り切れる順序対 (i,j) の個数: 9説明該当するペアは (1,5)、(

  6. C++で2つの配列から合計がKに等しいユニークなペアを数える方法

    この記事では、2つの整数配列 Arr1[] と Arr2[]、および目標値 K が与えられたときに、「Arr1[i] + Arr2[j] == K」を満たすユニークなペアの個数を求める方法を解説します。ペアは ( Arr1[i], Arr2[j] ) の形式で表されます。基本的な考え方は、二重ループですべての組み合わせを走査し、合計が K に一致するペアを見つけたら、unordered_map を使って重複を排除しながらカウントしていくというものです。具体例で確認してみましょう。入力例1Arr1[] = { 1,3,2,4,3,2 }; Arr2[] = { 0,2,1,2,3 }; K =

  7. C++でXとYだけを使って作れる数の個数を数える方法

    問題の概要 3つの整数 X、Y、N が与えられます(N は判定対象となる範囲 [1, N] を表します)。この課題のゴールは、1 から N までの数の中に、「X と Y のみを何度でも使って」構成できる数がいくつあるかを求めることです。 例えば X=2、Y=3 の場合を考えてみましょう。6 は「2 を3回足したもの(2+2+2)」でも「3 を2回足したもの(3+3)」でも作れます。同様に 7 は「2 を2回と 3 を1回(2+2+3)」で構成できます。一方で、X と Y の組み合わせではどうしても作れない数も存在します。 この問題は、1 から N までの各数値に対して X または Y を繰り返

  8. 【C++】N以下の平方数と非平方数の個数を求める方法

    整数 N が与えられたとき、1 から N の範囲に含まれる平方数(完全平方数)と非平方数の個数をそれぞれ求めるのが本記事の目的です。 素朴なアプローチ(Naive Approach) 1 から N までのすべての数を順番に走査し、各数が完全平方数かどうかを判定します。判定には次の条件を使用します。 floor(sqrt(i)) == ceil(sqrt(i)) この等式が成立する場合、その数は完全平方数であると判断できます。 効率的なアプローチ(Efficient Approach) N 以下の完全平方数は、次の式ひとつで求められます。 floor(sqrt(N)) この値がそのまま平方数の個

  9. C++で指定したパターンで終わる文字列の個数を数える方法

    問題概要文字列の配列 str[] と、パターン文字列 pat が与えられます。この記事の目的は、str[] の要素の中から、末尾がパターン pat と一致する文字列を見つけ出し、その個数を数えることです。解決のアプローチはシンプルです。配列内の各文字列を順番に走査し、末尾の文字を pat と比較します。一致した場合はカウントを1つ増やします。具体例を使って確認してみましょう。入力str[]={ kittens, hens, deers, dogs } pat=ens出力指定されたパターンで終わる文字列: 2説明kittens と hens の2つの文字列が ens で終わっています。入力str

  10. C++で指定した範囲内の素数の個数を数える方法

    はじめにプログラミングにおいて、指定された範囲内に含まれる素数の個数を求めることは、古典的でありながら非常に重要な課題の一つです。本記事では、C++を使って区間 [START, END] 内の素数を数える方法を解説します。ここでは、範囲の始点と終点を表す2つの変数 START と END が与えられます。目的は、この区間に含まれる素数の総数を求めることです。素数の判定には、シンプルな手法を用います。ある数 i が素数であるかどうかは、「1 と i 自身以外に、i を割り切る数が存在しないこと」を確認すれば判別できます。具体的には、2 から i/2 までの各整数で i を割り、余りが 0 になる

  11. C++で合計が指定値xに等しい4つの配列からなる4つ組(クアドラプル)を数える方法

    4つの配列 A[]、B[]、C[]、D[] が与えられたとき、A[i]+B[j]+C[k]+D[l] = x を満たす要素の組み合わせ(4つ組)がいくつ存在するかを求めるのが本記事の目的です。4つの配列はいずれも同じ要素数 N を持つものとします。解き方はシンプルです。各配列を順に走査しながら、A[i]+B[j]+C[k]+D[l] が x と等しいかどうかを1つずつ確認し、条件を満たす組み合わせが見つかるたびにカウントを増やしていきます。具体例で理解しましょう。入力例1A[]={ 1,2,3}; B[]={ 2,3,2}; C[]={ 4,3,1}; D[]={ 3,1,1 }; X=12出

  12. C++で円をN回カットしたときのピース数を計算する方法

    問題の概要整数Nが与えられます。このNは、2次元平面上の円に対して加える「カット(切り込み)」の回数を表します。1回のカットによって円は2つに分けられるため、N回のカットを行った後に円がいくつのピースに分割されるかを求めるのが、この問題の目的です。計算式この問題はとてもシンプルで、次の式で答えを求めることができます。ピースの数 = 2 × カットの回数(N)各カットが円の中心を通って切断されると考えると、カット1回ごとにピースが2つずつ増えていくため、この式が成り立ちます。具体例入力: N = 1出力: 円のピース数: 2説明: 1回のカットで、円はちょうど2つの半分に分けられます。入力: N

  13. C++でXとの和がXORに等しい数をカウントする方法

    整数Xが与えられたとき、0からXまでの範囲にある数のうち、「その数とXの和」が「その数とXのXOR(排他的論理和)」と等しくなるものをすべて見つけ、その個数を求めるのが本記事のテーマです。 最も基本的なアプローチは、i=0からi=Xまで順に調べ、各iについて「i + X == i ^ X」という等式が成り立つかどうかを確認することです。条件を満たすたびにカウントを増やしていき、最終的なカウントが答えとなります。 入出力例 入力 − X = 6 出力 − Xとの和がXORに等しい数の個数: 2 説明 − 条件を満たすのは0と1のみです。 入力 − X = 20 出力 − Xとの和がXOR

  14. C++で「Nとの差」が「NとのXOR」と等しくなる数の個数を求める

    整数 N が与えられたとき、0 以上 N 以下の数の中から「N との差(引き算の結果)」が「N との XOR(排他的論理和)」と一致する数をすべて見つけ、その個数を数えるのがこの記事の目的です。調べ方はシンプルで、i を 0 から N まで順に走査し、各 i に対して (N − i) == (i ^ N) が成立する場合にカウントを 1 増やしていきます。具体例で確認してみましょう。入力: N = 6出力: Nとの差がNとのXORと等しい数の個数: 4説明: 該当する数は 0、2、4、6 の 4 つです。入力: N = 20出力: Nとの差がNとのXORと等しい数の個数: 4説明: 該当する数

  15. C++で「NとのOR」と「NとのXOR」が等しくなる数をカウントする方法

    この記事では、整数 N が与えられたとき、0からNまでの範囲にある数のうち、「その数とNのOR(論理和)の結果」が「その数とNのXOR(排他的論理和)の結果」と等しくなるものを数える方法を解説します。具体的には、i = 0 から i <= N まで順番に走査し、それぞれの i について条件 (N ^ i) == (i | N) が成立する場合にカウントを1つずつ増やしていきます。具体例まずは例を使って問題を理解しましょう。入力: N = 6出力: 条件を満たす数の個数:2説明: 該当する数は 0 と 1 です。入力: N = 20出力: 条件を満たす数の個数:8説明: 該当する数は 0, 1,

  16. C++で整数Nを3つの部分に分割する方法の総数を求める

    正の整数Nが与えられたとき、Nを3つの部分に分割する方法が何通りあるかを求めるのが本記事の目的です。各部分は同じ値でも異なる値でも構いません。Nの範囲は[1, 5000]とします。 この問題は、3つの部分に対応する3重のforループを使って解けます。最も内側のループの中で、3つの値の合計がNと一致するかどうかを判定し、一致していればカウントを1つ増やします。 具体例で確認してみましょう。 入力 − N = 5 出力 − Nを3つに分割する方法の数:2 説明 − 5は(1, 1, 3)と(1, 2, 2)の2通りで表せます。 入力 − N = 9 出力 − Nを3つに分割する方法の数:7 説明

  17. C++で配列の積に含まれる末尾のゼロの個数を数える方法

    問題の概要正の整数からなるサイズNの配列 Arr[] が与えられます。この配列のすべての要素を掛け合わせた積に含まれる、末尾のゼロ(後続ゼロ)の個数を求めるのが目標です。解法のポイント:2と5の因数を数えるこの問題は、各数値に含まれる因数を数えることで解けます。2と5の積は10であり、10が1つの末尾ゼロを生み出すため、各要素を素因数分解したときの「2の個数」と「5の個数」をカウントします。そして最終的に、数の少ない方のカウントが積の末尾ゼロの個数となります。例えば、2が4個、5が6個ある場合、積の末尾ゼロは4個になります。2×2×2×2×5×5×5×5×5×5 = 250,000 となり、末

  18. C++で「同じ素数の和」として表せる配列要素の個数を数える

    正の整数からなるサイズ N の配列 Arr[] が与えられます。この配列の中から、「同じ素数を繰り返し足した和」として表現できる要素の個数を数えるのが本記事の目的です。例えば、4 = 2+2、6 = 3+3 や 2+2+2 のように表せます。ここで押さえておきたい重要な性質があります。同じ素数どうしの和を考えると、奇素数同士の和(奇数+奇数)であっても、偶数である 2 の和(2+2)であっても、結果は必ず偶数になります。さらに、0 と 2 を除くすべての正の偶数は「2 を繰り返し足す」ことで必ず表せるため(例:8 = 2+2+2+2)、結局「0 でも 2 でもない偶数」だけを数えればよいことに

  19. C++で2進表現がすべて1になる数の個数をカウントする方法

    正の整数 N が与えられたとき、N 以下の整数のうち、2進表現がすべて「1」で構成されている数の個数を求めるのが本記事の目的です。 たとえば、1 は「1」、3 は「11」、7 は「111」、15 は「1111」といった具合に、これらの数はすべて 2i − 1 の形で表されます(i は 1 から始まります)。したがって、N 以下に該当する数を調べるには、「2i − 1 ≤ N」が成り立つかどうかを順番に判定し、条件を満たすたびにカウントを増やしていけばよいのです。 入出力例 入力:N = 15 出力:2進表現がすべて1の数 : 4 説明:該当する数は 1, 3, 7, 15 の4つです。 入力:

  20. 【C++】2次元空間上の点のトリプル(A, B, C)のうち、中点条件を満たす組み合わせを数える方法

    問題の概要2次元平面上に与えられたN個の点の中から、「ある1点が他の2点を結ぶ線分の中点になっている」ような3点の組み合わせ(トリプル)の総数を求めるのがこの問題の目標です。トリプルを(A, B, C)としたとき、BがAとCの中点になっていれば条件を満たします(どの点が中点になっても構いません)。解き方の基本アイデアは次のとおりです。まず、すべての点を pair<int,int> 型として vector に格納し、さらにその全要素を set にも追加します。次に set 内から2点を選び、その(x, y)座標の合計を2で割った値が同じ set 内に存在するかどうかを調べます。存在す

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:221/300  20-コンピューター/Page Goto:1 215 216 217 218 219 220 221 222 223 224 225 226 227