C++で配列内の偶数を1減らすプログラムの書き方
ここでは、正の整数が格納されたサイズ n の配列 'arr' が与えられた場合を考えます。配列の中から偶数を見つけ出し、それらをすべて 1 減らす処理を行い、処理後の配列を出力します。
例えば、入力が n = 7、arr = {10, 9, 7, 6, 4, 8, 3} の場合、偶数である 10, 6, 4, 8 がそれぞれ 1 減らされ、出力は「9 9 7 5 3 7 3」となります。
解法のアプローチ
この問題は非常にシンプルで、以下の手順で解くことができます。
- 配列の先頭から末尾まで、各要素を順番に走査します。
- 現在の要素を 2 で割った余りが 0(つまり偶数)であれば、その要素を 1 減らします。
- 各要素(奇数の場合はそのまま、偶数の場合は減算後の値)を出力します。
- 最後に改行を出力して終了します。
擬似コードで表すと次のようになります。
for initialize i := 0, when i < n, update (increase i by 1), do:
if arr[i] mod 2 is same as 0, then:
(decrease arr[i] by 1)
print(arr[i])
print a new line
このアルゴリズムの計算量は、配列を一度だけ走査するため O(n) となり、非常に効率的です。また、追加のメモリも不要なインプレース処理です。
C++での実装例
理解を深めるために、実際の C++ コードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
#define N 100
void solve(int n, int arr[]) {
for (int i = 0; i < n; i++){
if (arr[i] % 2 == 0)
arr[i]--;
cout<< arr[i] << " ";
}
cout<< endl;
}
int main() {
int n = 7, arr[] = {10, 9, 7, 6, 4, 8, 3};
solve(n, arr);
return 0;
}
入力
7, {10, 9, 7, 6, 4, 8, 3}
出力
9 9 7 5 3 7 3
コードのポイント
- 偶数判定: 「arr[i] % 2 == 0」で剰余演算子を使って偶数かどうかを判定しています。
- デクリメント演算子: 「--」により該当する要素を簡単に 1 減らせます。
- 出力形式: 各要素を空白区切りで出力し、最後に改行しています。
このように、ループと条件分岐を組み合わせるだけで、配列内の偶数を効率的に処理することができます。
-
【C++】配列内のすべての素数の積を求める方法
整数型配列 arr[] が与えられたとき、その配列に含まれるすべての素数を見つけ出し、それらの積を計算するのが本記事のテーマです。素数とは、1とその数自身でしか割り切れない正の整数のことです。たとえば、2、3、5、7、11などが素数に該当します。それでは、次の配列を例に解を求めてみましょう。入力: arr[] = { 11, 20, 31, 4, 5, 6, 70 }出力: 1705説明: 配列内の素数は 11、31、5 の3つであり、その積は 11 × 31 × 5 = 1705 となります。入力: arr[] = { 1, 2, 3, 4, 5, 6, 7 }出力: 210説明: 配列内の
-
C++で左右の偶数・奇数の出現回数が一致する配列インデックスを見つける方法
問題の概要 ここで取り上げるのは次のような問題です。n個の要素を持つ配列が与えられたとき、「あるインデックスの左側にある偶数の出現回数と右側にある偶数の出現回数が等しい」、または「左側にある奇数の出現回数と右側にある奇数の出現回数が等しい」という条件を満たすインデックスを1つ見つけます。該当するインデックスが存在しない場合は -1 を返します。 例として、配列が {4, 3, 2, 1, 2, 4} の場合を考えてみましょう。このとき答えは 2 になります。インデックス2の要素は「2」であり、その左側には奇数が1つ(3)、右側にも奇数が1つ(1)しか存在しないためです。 解決のアプローチ こ