C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で配列内のkで割り切れる要素の個数を数える方法

本記事では、正の整数からなる配列と整数変数 k が与えられたとき、配列の中に k で割り切れる要素がいくつあるかを求める方法を解説します。

入力例と出力例

入力 − int arr[] = {4, 2, 6, 1, 3, 8, 10, 9}, k = 2

出力 − 2 で割り切れる要素の個数は − 5

説明 − 配列の各要素を k で割り、余りが 0 になるかどうかを確認します。4、2、6、8、10 は 2 で割り切れますが、1、3、9 は割り切れません。したがって、k(= 2)で完全に割り切れる要素は 5 個となります。

入力 − int arr[] = {3, 2, 9, 15, 0, 8, 10}, k = 3

出力 − 3 で割り切れる要素の個数は − 3

説明 − 同様に各要素を 3 で割った余りを調べます。3、9、15 は 3 で割り切れますが、2、0、8、10 は割り切れません。したがって、該当する要素は 3 個です。

アプローチ1:素朴な方法(全要素を走査)

問題を解くには複数のアプローチがありますが、まずは最も基本的な方法から見ていきましょう。

  • 整数型の配列と整数変数 k を入力として受け取る
  • 配列の長さを計算し、処理用の関数にデータを渡す
  • k で割り切れる要素の個数を格納する一時変数 count を用意する
  • 0 から配列の長さまで FOR ループを回す
  • ループ内で arr[i] % k == 0 であるかを判定し、条件を満たせば count を 1 増やす
  • count を返して結果を出力する

サンプルコード(素朴な方法)

#include <bits/stdc++.h>
using namespace std;
int divisible_k(int arr[], int size, int k){
    int count = 0;
    for(int i = 0; i<size; i++){
        if(arr[i]%k==0){
            count++;
        }
    }
    return count;
}
int main(){
    int arr[] = {4, 2, 6, 1, 3, 8, 10, 9};
    int k = 2;
    int size = sizeof(arr) / sizeof(arr[0]);
    cout<<"2で割り切れる要素の個数: "<<divisible_k(arr, size, k);
    return 0;
}

実行結果

2で割り切れる要素の個数: 5

アプローチ2:STL の count_if() を使った効率的な方法

C++ では標準テンプレートライブラリ(STL)の count_if() 関数を利用することで、より簡潔に記述できます。

  • 整数型の vector に要素を格納し、整数変数 k を用意する
  • k で割り切れる要素の個数を格納する一時変数 count を宣言する
  • count を count_if() の呼び出し結果として設定する。vector.begin()vector.end() を引数に渡して走査を行い、ラムダ式で i % k == 0 となる要素だけをカウントする
  • 結果を出力する

サンプルコード(効率的な方法)

#include <bits/stdc++.h>
using namespace std;
int main(){
    vector<int> vec = {4, 2, 6, 1, 3, 8, 10, 9};
    int count = count_if(vec.begin(), vec.end(), [](int i, int k = 2) { return i % k == 0; });
    cout<<"kで割り切れる要素の個数: "<<count;
    return 0;
}

実行結果

kで割り切れる要素の個数: 5

まとめ

どちらのアプローチも計算量は O(n) ですが、count_if() を使うことでコードが大幅に簡潔になり、意図も明確になります。単純なループ処理で十分なケースもありますが、C++ では STL アルゴリズムを活用することで可読性の高いコードを書ける点が大きなメリットです。

  1. 【C++】Dで割り切れるN桁の数を見つけるアルゴリズム

    2つの整数 N と D が与えられたとき、D で割り切れる N 桁の数を見つける問題を考えます。例えば、N = 3、D = 5 の場合、答えは 500 になります。一見難しそうに思えるこの問題ですが、実はとてもシンプルな発想で解決できます。解法のアイデア基本となる考え方は、「D を先頭に置き、その後ろに 0 を付け足して N 桁にする」というものです。D の桁数を m とすると、D の末尾に (N − m) 個の 0 を連結した数は、全体でちょうど N 桁となり、必ず D で割り切れます。これは、作成される数が D × 10(N−m) に相当し、10 のべき乗を掛けても D で割り切れるという

  2. C++ですべての要素を割り切れる配列の要素を見つける方法

    いくつかの要素を持つ配列 A があるとします。この中から「他のすべての要素を割り切ることができる」1つの要素を見つけたいと思います。例として、配列 A = [15, 21, 69, 33, 3, 72, 81] を考えてみましょう。この場合、答えは 3 になります。リスト内のすべての数値が3で割り切れるためです。解決策のアプローチこの問題は、以下の手順でシンプルに解くことができます。まず、配列内の最小値を求めます。次に、すべての要素がその最小値で割り切れるかどうかを確認します。すべて割り切れれば、その最小値を返します。1つでも割り切れない要素があれば、-1 を返します(条件を満たす要素は存在し