配列内で奇数回出現する数値を見つけるC/C++プログラム
正の整数からなる配列の中で、奇数回出現する数値を見つけるC++プログラムを紹介します。この配列では、答えとなる1つの数だけが奇数回出現し、それ以外のすべての数値は偶数回出現するものとします。
入力: arr[] = {5, 7, 8, 8, 5, 8, 8, 7, 7}
出力: 7
アルゴリズムの解説
この方法では、二重ループを使用します。外側のループで配列の各要素を1つずつ順番に走査し、内側のループでその要素が配列全体に出現する回数をカウントします。カウントした結果が奇数であれば、その要素が求める答えとなります。
上記の例では、数値「5」は2回、「8」は4回出現していますが、「7」だけが3回出現しているため、出力は「7」になります。
なお、この二重ループによる手法の計算量はO(n²)です。より効率的に処理したい場合は、XOR(排他的論理和)を活用する方法があります。同じ数同士のXORは0になるという性質を利用すると、O(n)の計算量で奇数回出現する数値を特定できます。
実装例
#include <iostream>
using namespace std;
int Odd(int arr[], int n){
for (int i = 0; i < n; i++) {
int ctr = 0;
for (int j = 0; j < n; j++) {
if (arr[i] == arr[j])
ctr++;
}
if (ctr % 2 != 0)
return arr[i];
}
return -1;
}
int main() {
int arr[] = {5, 7, 8, 8, 5, 8, 8, 7, 7};
int n = 9;
cout <<Odd(arr, n);
return 0;
}
このプログラムを実行すると、配列内で奇数回出現している「7」が出力されます。該当する数値が存在しない場合には、関数は-1を返すようになっています。
-
C/C++プログラムで放物線の頂点・焦点・準線を求める方法
この記事では、C言語またはC++のプログラムを使って、放物線の頂点・焦点・準線(ダイレクトリックス)を求める方法を解説します。これらのパラメータを計算するには、放物線の一般方程式が必要です。一般式は次のとおりです。y = ax2 + bx + cここで、係数 a、b、c の値はあらかじめ与えられているものとします。各パラメータを求める公式頂点(Vertex)放物線の頂点は、次の座標で表されます。x = −b / (2a)y = (4ac − b2) / (4a)焦点(Focus)焦点は、頂点より 1/(4a) だけ上に位置します(a > 0 の場合)。x = −b / (2a)y = (
-
マッチ棒で作る三角ピラミッドに必要な本数を計算するC/C++プログラム
この記事では、下図のようなピラミッド状の三角形を作るために必要なマッチ棒の本数を求める方法を解説します。ピラミッドの底辺のサイズが与えられたとき、そのサイズに応じて必要なマッチ棒の総本数を計算します。例えば、底辺のサイズが1の場合は3本、底辺が2の場合は9本、底辺が3の場合は18本のマッチ棒が必要になります。必要なマッチ棒の本数を求める公式この問題を解くには、以下の公式を使用します。必要なマッチ棒の本数 = 3 × x × (x + 1) ÷ 2ここで、x はピラミッドの底辺のサイズです。この公式を使えば、ループで一つずつ数え上げることなく、O(1)の計算量で即座に答えを求められます。C++で