C++で配列要素の積の約数の個数を数える方法
整数型の配列 arr[] が与えられたとき、そのすべての要素を掛け合わせた値の約数がいくつあるかを求めるのが本記事のテーマです。
配列とは、同じ型の要素を固定サイズで連続的に格納できるデータ構造の一種です。複数のデータをひとまとめに扱うために使われ、「同じ型の変数の集まり」として考えると理解しやすくなります。
具体例
入力: int arr[] = {2, 3}
出力: count is 4
解説: 配列の積は 2 × 3 = 6 です。6 の約数は 1, 2, 3, 6 の 4 個なので、答えは 4 となります。
入力: int arr[] = {2, 3, 5}
出力: count is 8
解説: 配列の積は 2 × 3 × 5 = 30 です。30 の約数は 1, 2, 3, 5, 6, 10, 15, 30 の 8 個なので、答えは 8 となります。
アルゴリズムの手順
- 配列 arr[] を用意します。
- sizeof 演算子などを使って配列の要素数(サイズ)を求めます。
- 一時変数 temp を宣言し、1 で初期化します。
- i を 0 から配列サイズ未満までループさせ、temp *= arr[i] ですべての要素の積を計算します。
- 約数の個数を返す関数 divisors() を呼び出します。
- divisors() 内では、i を 1 から N 以下までループさせ、N % i == 0 が成立するたびにカウントを 1 ずつ増やします。
- 最終的なカウントを返し、結果を出力します。
C++ 実装例
#include <iostream>
using namespace std;
// 約数の個数を数える関数
int divisors(int N) {
int result = 0; // 結果を 0 で初期化
for (int i = 1; i <= N; ++i) {
if (N % i == 0) { // i が N の約数ならば
result++; // カウントを増やす
}
}
return result;
}
// 配列の全要素の積の約数を数える関数
int countmultiples(int arr_1[], int size) {
int temp = 1; // 積を計算するための変数
for (int i = 0; i < size; ++i) {
temp *= arr_1[i];
}
return divisors(temp);
}
// メイン関数
int main() {
int arr_1[] = { 5, 10, 15 };
int size = sizeof(arr_1) / sizeof(arr_1[0]);
cout << "count is " << countmultiples(arr_1, size);
return 0;
}
出力結果
上記のコードを実行すると、次の出力が得られます。
count is 16
この場合、配列の積は 5 × 10 × 15 = 750 となり、750 の約数はちょうど 16 個あります。
効率化のための補足
上記の divisors() 関数は 1 から N まで順番に調べるため、計算量は O(N) です。N が大きくなると処理時間が伸びるため、次のような改善が有効です。
- √N まで調べる方法: i が N の約数なら N / i も必ず約数になります。そこで 1 から √N まで調べて約数を 2 個ずつ数えれば、計算量を O(√N) に抑えられます(i² = N の場合は 1 個だけ加算します)。
- 素因数分解を利用する方法: 積を素因数分解し、各素因数の指数を e₁, e₂, … とすると、約数の個数は (e₁+1) × (e₂+1) × … という式で求められます。大きな数でも高速に計算できる強力な手法です。
- オーバーフローへの注意: 要素数が多い場合、積は急激に巨大になり、int 型ではすぐにオーバーフローします。必要に応じて long long 型を使用するか、積を直接計算せずに素因数ごとの指数を管理する設計にすると安全です。
-
C++で平面内に形成できる平行四辺形の数を数えるアルゴリズム
本記事の課題は、平面上に与えられた点集合から形成できる平行四辺形の個数を求めることです。平行四辺形とは、四角形の対辺が互いに平行であり、それに伴って対角も等しくなる四角形のことを指します。 入力 − int a[] = {0, 2, 5, 5, 2, 5, 2, 5, 2} int b[] = {0, 0, 1, 4, 3, 8, 7, 11, 10} 出力 − 平面内の平行四辺形の数 − 3 説明 − (x, y) 座標の点が与えられており、これらの点を組み合わせると、図のように 3 つの平行四辺形を形成できます。 入力 − a[] = {0, 3, 1, 4, 1, 5} b[] =
-
配列の全要素を乗算するC++プログラムの解説
整数型の要素を持つ配列が与えられたとき、配列内のすべての要素を掛け合わせ、その積を表示することを考えます。本記事では、この問題をC++(C言語スタイルのコード)で解く方法を、アプローチ、アルゴリズム、サンプルコード、実行結果まで順を追って解説します。 例 入力: arr[]={1,2,3,4,5,6,7} 出力: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 入力: arr[]={3, 4, 6, 2, 7, 8, 4} 出力: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 解き方のアプローチ この問題は、累積用の一時変数を用意し、配列の要素を先頭