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 アルゴリズムを活用することで可読性の高いコードを書ける点が大きなメリットです。
-
【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 で割り切れるという
-
C++ですべての要素を割り切れる配列の要素を見つける方法
いくつかの要素を持つ配列 A があるとします。この中から「他のすべての要素を割り切ることができる」1つの要素を見つけたいと思います。例として、配列 A = [15, 21, 69, 33, 3, 72, 81] を考えてみましょう。この場合、答えは 3 になります。リスト内のすべての数値が3で割り切れるためです。解決策のアプローチこの問題は、以下の手順でシンプルに解くことができます。まず、配列内の最小値を求めます。次に、すべての要素がその最小値で割り切れるかどうかを確認します。すべて割り切れれば、その最小値を返します。1つでも割り切れない要素があれば、-1 を返します(条件を満たす要素は存在し