C++で配列の合計を偶数にするために追加する最小の数を求める方法
ある数値が格納された配列があるとします。この配列の要素の合計を偶数にするために、最小でいくつの数を追加する必要があるかを求めるのが本記事の目的です。ただし、追加する数は0より大きい正の整数でなければなりません。
ルールはシンプルです。要素の合計が奇数の場合は1を追加すれば偶数になります。一方、合計がすでに偶数である場合は、0を追加することが許されていないため、最小の正の偶数である2を追加することになります。
アルゴリズム
addMinNumber(arr)
begin
s := 0
for each element e from arr, do
s := e + s
done
if s is even, then return 2, otherwise 1
end処理の流れ
1. 配列内のすべての要素を順番に足し合わせて、合計値 s を求めます。
2. 合計値 s が偶数であれば 2 を返し、奇数であれば 1 を返します。
サンプルコード(C++)
#include<iostream>
using namespace std;
int addMinNumber(int arr[], int n) {
int sum = 0;
for(int i = 0; i<n; i++) {
sum += arr[i];
}
return (sum % 2)? 1 : 2;
}
main() {
int arr[] = {5, 8, 4, 7, 5};
int n = sizeof(arr)/sizeof(arr[0]);
cout << "Minimum " << addMinNumber(arr, n) << " should be added";
}出力結果
Minimum 1 should be added
コードの解説
この例では、配列 {5, 8, 4, 7, 5} の合計は 5 + 8 + 4 + 7 + 5 = 29 となり、奇数です。そのため、関数 addMinNumber() は 1 を返し、「Minimum 1 should be added(最小で1を追加すべき)」という結果が出力されます。
このアルゴリズムの計算量は O(n) であり、配列を一度走査するだけで答えが求まるため、非常に効率的な手法といえます。
-
C++で配列を「良い配列」にするために削除が必要な最小要素数を求めるアルゴリズム
問題の概要整数型配列「arr」が与えられたとき、この配列を「良い配列」にするために削除する必要がある要素の最小数を求めるのが課題です。ここで「良い配列」とは、数列 a1, a2, a3, ... an の各要素 a[i] に対して、i ≠ j を満たす別の要素 a[j] が必ず存在し、a[i] + a[j] の和が2の累乗(べき乗)になるような配列のことを指します。具体例arr1[] = {1, 1, 7, 1, 5}上記の配列では、要素「5」を1つ削除するだけで配列は良い配列になります。削除後は、任意のペア arr[i] + arr[j] の和が2の累乗になります。arr[0] + arr[
-
C++で配列内の数値の頻度(出現回数)を求める方法
配列に n 個の異なる要素が格納されているとします。この配列の中から、特定の要素が何回出現するか(頻度)を調べたい場合があります。例えば、配列 A = [5, 12, 26, 5, 3, 4, 15, 5, 8, 4] の中で「5」の頻度を調べると、答えは 3 になります。アルゴリズムの考え方この問題は、次の手順で解くことができます。1. 配列を左端から順に走査します。2. 現在の要素が調べたい数値と一致したら、カウンターを1つ増やします。3. 一致しない場合は、そのまま次の要素へ進みます。4. 配列の最後まで走査したら、カウンターの値が頻度となります。このアルゴリズムの計算量は O(n) で