配列内の素数と非素数の積の絶対差を求めるアルゴリズム
本記事では、配列に含まれるすべての素数の積と、すべての非素数(合成数)の積との間の絶対差を求める方法を解説します。
この問題を解くには、まず各要素が素数かどうかを判定する必要があります。素数判定の代表的な手法の一つとして、「2 からその数の平方根までのどの整数でも割り切れないこと」を確認する方法があります。ある数 n が合成数であれば、必ず √n 以下の約数を持つため、√n まで調べれば十分であり、判定にかかる計算量は O(√n) で抑えられます。
すべての要素について素数かどうかを判定したら、それぞれのグループごとに積を計算し、最後に両者の差の絶対値を求めます。
アルゴリズム
diffPrimeNonPrimeProd(arr)
begin prod_p := 配列 arr 内のすべての素数の積 prod_np := 配列 arr 内のすべての非素数の積 return |prod_p − prod_np| end
C++ による実装例
#include <iostream>
#include <cmath>
using namespace std;
bool isPrime(int n){
for(int i = 2; i<=sqrt(n); i++){
if(n % i == 0){
return false; // 素数ではない
}
}
return true; // 素数
}
int diffPrimeNonPrimeProd(int arr[], int n) {
int prod_p = 1, prod_np = 1;
for(int i = 0; i<n; i++){
if(isPrime(arr[i])){
prod_p *= arr[i];
} else {
prod_np *= arr[i];
}
}
return abs(prod_p - prod_np);
}
main() {
int arr[] = { 4, 5, 3, 8, 13, 10};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Difference: " << diffPrimeNonPrimeProd(arr, n);
}出力
Difference: 125
処理の流れと解説
上記の実装例では、配列 {4, 5, 3, 8, 13, 10} を入力としています。このうち素数は 5、3、13 であり、それらの積は 5 × 3 × 13 = 195 です。一方、非素数は 4、8、10 であり、それらの積は 4 × 8 × 10 = 320 です。
したがって、求める絶対差は |195 − 320| = 125 となり、出力結果と一致します。
補足:実装上の注意点
- isPrime 関数では、1 以下の数に対する明示的なチェックを行っていないため、1 が素数として扱われる可能性があります。実際の運用では n < 2 の場合に false を返すよう修正することを推奨します。
- 全体の計算量は、配列の長さを n、要素の最大値を m とすると O(n·√m) になります。
-
【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説明: 配列内の
-
【Java】配列内の最大素数と最小素数の差を求める方法|エラトステネスの篩で効率的に解く
問題の概要100万未満の整数要素で構成される配列が与えられたとき、配列内に存在する最大の素数と最小の素数の差を求めます。実行例たとえば、次のような配列を考えてみましょう。配列: [1, 2, 3, 4, 5]最大の素数 = 5最小の素数 = 2差 = 5 - 2 = 3解決アプローチ:エラトステネスの篩この問題を効率的に解くには、エラトステネスの篩(Sieve of Eratosthenes)という古典的なアルゴリズムを使用します。これは、ある数値以下のすべての素数を高速に列挙できる手法として知られています。具体的な手順は以下の通りです。あらかじめ100万以下のすべての素数をエラトステネスの篩