配列内で奇数回出現する数を見つけるC/C++プログラム
配列内で奇数回出現する数を見つける方法
このプログラムでは、配列内で奇数回出現する数を求める方法を解説します。アプローチはいくつかありますが、その中でも最も簡単な方法の一つがXOR(排他的論理和)演算を利用する方法です。
XOR演算には以下のような性質があります。
- ある数をそれ自身とXORすると、結果は0になります(A XOR A = 0)
- ある数を0とXORすると、結果はその数自体になります(A XOR 0 = A)
したがって、配列内のすべての要素を順番にXORしていくと、偶数回出現する要素は互いに打ち消し合って0になり、最終的に残るのは奇数回出現する要素だけです。
ただし、この解法には一つ注意点があります。奇数回出現する要素が複数存在する場合、そのうちの一つが返されることになります。
アルゴリズム
getNumOccurredOdd(arr, n)
begin
res := 0
for each element e from arr, do
res := res XOR e
done
return res
end処理の流れは以下の通りです。
- 結果を格納する変数
resを 0 で初期化します。 - 配列の各要素
eに対してresとのXORを計算し、結果をresに代入します。 - すべての要素を処理し終えたときの
resの値が答えとなります。
サンプルコード(C++)
#include <iostream>
using namespace std;
int getNumOccurredOdd(int arr[], int n) {
int res = 0;
for (int i = 0; i < n; i++)
res = res ^ arr[i];
return res;
}
int main() {
int arr[] = {3, 4, 6, 5, 6, 3, 5, 4, 6, 3, 5, 5, 3};
int n = sizeof(arr)/sizeof(arr[0]);
cout << getNumOccurredOdd(arr, n) << " は奇数回出現しています";
}実行結果
6 は奇数回出現しています
計算量
このアルゴリズムの時間計算量は O(n)、空間計算量は O(1) と非常に効率的です。配列を一度走査するだけで答えが求まるため、大きなデータセットに対しても高速に動作します。
-
C/C++で数の一意な素因数の積を求めるプログラム
一意な素因数とは一意な素因数(ユニークな素因数)とは、ある数の約数の中で、それ自体が素数であるものを指します。本記事では、与えられた整数に対して、重複しないすべての素因数を掛け合わせた積を求める方法を解説します。なお、素数とは「1とその数自身」の2つしか約数を持たない数のことです。問題を例で理解するまず、具体的な例を使って問題を整理しましょう。例として n = 1092 を考えます。この数の一意な素因数の積を求めます。1092 の素因数:2、3、7、13これらの積:2 × 3 × 7 × 13 = 546Input: n = 10 Output: 10出力の説明入力された数は 10 です。10
-
三角マッチ棒数を求めるC/C++プログラムの解説と実装例
三角マッチ棒数とはマッチ棒を正三角形の形に並べて作った三角形のことを「三角マッチ棒数(Triangular Matchstick Number)」と呼びます。三角マッチ棒数とは、そのマッチ棒の三角形を作るために必要なマッチ棒の本数を指します。問題の概要この問題では、マッチ棒で作るピラミッドの段数 X が与えられます。そして、X 段のマッチ棒ピラミッドを構成するために必要なマッチ棒の最小総本数を出力するプログラムを作成するのが課題です。概念をより明確にするために、具体例を見てみましょう。入力: 7 出力: 84解法の考え方この問題は、三角数(Triangular Number)の拡張として考える