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
-
C++で数を割り切る桁の個数を求める方法
問題の概要ある整数が与えられたとき、その数を割り切る桁(各桁の数字)の個数を数える問題です。例として、数が 1012 の場合を考えてみましょう。この場合、答えは 3 となります。1、1、2 の3つの桁がそれぞれ 1012 を割り切れるためです。解法のアプローチこの問題を解くには、剰余演算(% 演算子)を使って数の各桁を1つずつ取り出し、元の数がその桁の値で割り切れるかどうかを判定します。割り切れる場合はカウンターを1つ増やします。なお、桁が 0 の場合は 0 で割ることができないため、その桁はスキップ(無視)します。アルゴリズムの流れ元の数のコピーを作成し、0 になるまでループを繰り返します。
-
C++でXORが0になる配列内のペアの数を求める方法
n個の要素を含む配列が与えられたとき、XOR(排他的論理和)の計算結果が0になるペアの数を求めることを考えます。ペア(x, y)のXORが0になるのは、x = y が成り立つ場合、すなわち2つの値が等しいときだけです。これは「同じ数値同士のXORは必ず0になる」というビット演算の基本的な性質によるものです。解法のアプローチこの問題は、次の手順で解くことができます。まず、配列を昇順にソートします。ソート後は同じ値どうしが隣り合って並ぶため、連続する2つの要素を比較し、等しければカウントを1つ増やします。すべての要素が同じ値である場合、末尾側のペアがカウントから漏れる可能性があります。そこで、配列