C++
 Computer >> コンピューター >  >> プログラミング >> C++

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つ増やしていきます。

それでは、具体例を見ながら理解を深めましょう。

入力 − Arr[]= { 2,4,3,6 }、N=4

出力 − 有効なペアの個数 − 3

説明 − 有効なペアは以下の通りです。

Arr[0] & Arr[1] → (2,4) ここで 4%2==0、かつ 0!=1
Arr[0] & Arr[3] → (2,6) ここで 6%2==0、かつ 0!=3
Arr[2] & Arr[3] → (3,6) ここで 6%3==0、かつ 2!=3

入力 − Arr[]= { 2,5,7,9,11 }、N=5

出力 − 有効なペアの個数 − 0

説明 − どの要素も他の要素を割り切ることができないため、有効なペアは1つも存在しません。

プログラムで使用するアプローチ

  • ランダムな値で初期化された整数型配列 Arr[] を用意します。

  • Arr[] の長さを格納する変数 n を宣言します。

  • 関数 countPairs(int arr[], int n) は、配列とその長さを引数として受け取り、条件を満たす有効なペアの個数を返します。

  • 2つのforループを使って配列を走査し、ペアを構成する各要素を調べます。

  • 外側のループは 0<=i<n-1 の範囲、内側のループは i<j<n の範囲で実行します。

  • arr[i]%arr[j]==0 または arr[j]%arr[i]==0 であるかを判定し、いずれかの条件が真であればカウントを1増やします。

  • すべてのループが完了した時点で、count には有効なペアの総数が格納されています。

  • 最後に count を結果として返します。

なお、この方法はすべてのペアを順に調べるため、計算量は O(n²) となります。小規模な配列では十分実用的ですが、大規模データではより効率的なアルゴリズムの検討が必要です。

コード例

#include <bits/stdc++.h>
using namespace std;
int countPairs(int arr[], int n){
   // ペアの個数
   int count = 0;
   for (int i = 0; i < n-1; i++){
      for (int j = i + 1; j < n; j++){
         if(arr[i]%arr[j]==0 || arr[j]%arr[i]==0)
            { count++; }
      }
   }
   return count;
}
int main(){
   int Arr[] = { 2,3,4,5,6 };
   int len = sizeof(Arr) / sizeof(Arr[0]);
   cout << "ペアの個数 : "<< countPairs(Arr, len);
   return 0;
}

出力

上記のコードを実行すると、次のような出力が得られます。

ペアの個数 : 3
  1. C++で数を割り切る桁の個数を求める方法

    問題の概要ある整数が与えられたとき、その数を割り切る桁(各桁の数字)の個数を数える問題です。例として、数が 1012 の場合を考えてみましょう。この場合、答えは 3 となります。1、1、2 の3つの桁がそれぞれ 1012 を割り切れるためです。解法のアプローチこの問題を解くには、剰余演算(% 演算子)を使って数の各桁を1つずつ取り出し、元の数がその桁の値で割り切れるかどうかを判定します。割り切れる場合はカウンターを1つ増やします。なお、桁が 0 の場合は 0 で割ることができないため、その桁はスキップ(無視)します。アルゴリズムの流れ元の数のコピーを作成し、0 になるまでループを繰り返します。

  2. C++でXORが0になる配列内のペアの数を求める方法

    n個の要素を含む配列が与えられたとき、XOR(排他的論理和)の計算結果が0になるペアの数を求めることを考えます。ペア(x, y)のXORが0になるのは、x = y が成り立つ場合、すなわち2つの値が等しいときだけです。これは「同じ数値同士のXORは必ず0になる」というビット演算の基本的な性質によるものです。解法のアプローチこの問題は、次の手順で解くことができます。まず、配列を昇順にソートします。ソート後は同じ値どうしが隣り合って並ぶため、連続する2つの要素を比較し、等しければカウントを1つ増やします。すべての要素が同じ値である場合、末尾側のペアがカウントから漏れる可能性があります。そこで、配列