C++でビットごとのAND演算を使って偶数になるペアの数を数える方法
整数型の配列が与えられたとき、その配列の要素から作れるすべてのペアのうち、ビットごとのAND演算の結果が偶数になるペアの総数を求めるのがこの記事の課題です。
AND演算の真理値表
| A | B | A & B |
| 0 | 0 | 0 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |
AND演算は、両方のビットが1であるときにだけ1を返します。したがって、偶数かどうかを決める最下位ビット(LSB)に注目すると、少なくとも一方が偶数であればANDの結果は必ず偶数になり、逆に奇数同士のペアだけが奇数の結果をもたらすことが分かります。この性質を利用すれば、全ペアを実際に調べることなく、効率よく答えを計算できます。
入力と出力の例
入力: int arr[] = {2, 5, 1, 8, 9}
出力: ビットANDが偶数になるペアの数 − 7
説明:
| a1 | a2 | a1 & a2 |
| 2 | 5 | 0 |
| 2 | 1 | 0 |
| 2 | 8 | 0 |
| 2 | 9 | 0 |
| 5 | 1 | 1 |
| 5 | 8 | 0 |
| 5 | 9 | 1 |
| 1 | 8 | 0 |
| 1 | 9 | 1 |
| 8 | 9 | 8 |
上の表からも分かるように、10通りのペアのうち結果が奇数になるのは (5, 1)、(5, 9)、(1, 9) の3組、つまり奇数同士のペアだけであり、残りの7組はすべて偶数になっています。
プログラムで使用するアプローチ
- ペアを作成する対象となる整数要素の配列を入力として受け取ります。
- 配列のサイズを計算し、そのデータを処理用の関数へ渡します。
- 配列内の奇数の個数を格納する一時変数 count を用意します。
- FORループを i = 0 から配列サイズまで回します。
- ループ内で arr[i] % 2 != 0(奇数である場合)なら count を1増やします。
- count を count * (count - 1) / 2 に更新し、奇数同士の組み合わせの総数(=AND結果が奇数になるペア数)を求めます。
- 全ペアの総数 total_pair を size * (size - 1) / 2 で計算します。
- total_pair から奇数ペアの数を引けば、AND結果が偶数になるペア数が求まります。
- その値を返し、結果を出力します。
この方法では配列を一度走査するだけなので、時間計算量は O(n) となり、全ペアを二重ループで確認する O(n²) の素朴な方法よりもはるかに高速です。
サンプルコード
#include <iostream>
using namespace std;
//Count pairs with Bitwise AND as EVEN number
int count_pair(int arr[], int size){
int count = 0;
for (int i = 0; i < size; i++){
if (arr[i] % 2 != 0){
count++;
}
}
count = count * (count - 1) / 2;
int total_pair = (size * (size - 1) / 2);
int odd = total_pair - count;
return odd;
}
int main(){
int arr[] = {2, 5, 1, 8, 3 };
int size = sizeof(arr) / sizeof(arr[0]);
cout<<"Count of pairs with Bitwise-AND as even number are: "<<count_pair(arr, size) << endl;
return 0;
}
実行結果
上記のコードを実行すると、次の出力が得られます −
Count of pairs with Bitwise-AND as even number are: 7
-
C++で配列内の偶数・奇数要素の個数を数える方法
このチュートリアルでは、配列に含まれる偶数要素と奇数要素の個数を求めるC++プログラムについて解説します。ここでは、あらかじめ整数の配列が与えられているものとします。私たちの課題は、その配列の中に偶数がいくつ、奇数がいくつ含まれているかを正確にカウントすることです。考え方基本的なアプローチは非常にシンプルです。以下の手順で処理を行います。偶数・奇数それぞれのカウント用変数を0で初期化するfor文を使って配列の全要素を先頭から順に走査する各要素を2で割った余り(剰余演算 %)を判定し、余りが0なら偶数、そうでなければ奇数としてカウントする最後に両方の結果を出力するサンプルコード#include&
-
C++で差がkに等しいすべての異なるペアを数える方法
はじめにこのチュートリアルでは、C++を使って「差がkに等しい異なるペア」を見つけて数える方法を解説します。具体的には、整数型の配列と値kが与えられ、その中から差がちょうどkとなるすべての異なるペアを数えることが課題です。アルゴリズムの考え方最もシンプルなアプローチは、配列の要素を1つずつ順番に選び、それ以降の要素との差をすべてチェックする方法です。2つの要素の差がkに等しければ、カウンターを1つ増やします。例えば、配列 {1, 5, 3, 4, 2}、k = 3 の場合、差が3となるペアは (1, 4) と (5, 2) の2つなので、答えは2になります。実装例#include<ios