C++で2つの配列から素数ペアの合計として得られる一意な値の個数を求める方法
素数と非素数を含む2つの配列が与えられます。この記事の目的は、各配列から素数を取り出してペアを作り、その合計として得られる一意な値の個数を求めることです。
アプローチとしては、両方の配列からそれぞれ素数を選んでペアを作り、その合計を set<int> 型のコンテナに格納していきます。set は重複する値を自動的に排除してくれるため、最終的な set のサイズが「一意な素数の合計の個数」と一致します。
具体例で確認してみましょう。
入力
Arr1[] = { 1,2,3 } Arr2[] = { 2,3,4}出力
Distinct Sums of primes :3
説明
素数ペア:(2,2), (2,3), (3,2), (3,3) 一意な合計:4, 5, 6
入力
Arr1[] = { 1,4,6 } Arr2[] = { 2,3,5 }出力
Distinct Sums of primes :0
説明
Arr1[] には素数が1つも含まれていないため、素数ペアが存在しません。
プログラムで使用しているアプローチ
正の整数を含む2つの配列 Arr1[] と Arr2[]、およびそれぞれの長さ len1 と len2 を用意します。
関数 isprime(int num) は、num が素数であれば 1 を、そうでなければ 0 を返します。
関数 prime_Sums(int arr1[], int arr2[], int l1, int l2) は両方の配列を受け取り、素数ペアの合計として得られる一意な値の個数を返します。
一意な合計を格納するための set<int> sum を用意します。
for ループを使って、両方の配列の各要素を走査します。
isprime(arr1[i]) && isprime(arr2[j]) が真である場合、合計 tmp = arr1[i] + arr2[j] を計算します。
sum.insert(tmp) によって tmp を set に追加します。重複する値は自動的に無視されます。
最後に sum.size() を結果として返します。これが一意な素数の合計の個数です。
例
#include<bits/stdc++.h>
using namespace std;
int isprime(int num){
if (num <= 1)
return 0;
for (int i = 2; i <= num/2; i++)
if (num % i == 0)
return 0;
return 1; // どちらの判定にも引っかからなければ num は素数
}
int prime_Sums(int arr1[],int arr2[],int l1,int l2){
int count=0;
set<int> sum;
for (int i = 0; i < l1; i++){
for(int j=0; j < l2; j++){
if(isprime(arr1[i]) && isprime(arr2[j])){
int tmp=arr1[i]+arr2[j];
sum.insert(tmp);
}
}
}
return sum.size();
}
int main(){
int Arr1[] = { 2, 3, 5 };
int Arr2[] = { 2, 2, 4, 7 };
int len1=sizeof(Arr1) / sizeof(Arr1[0]);
int len2=sizeof(Arr2) / sizeof(Arr2[0]);
cout<<"Distinct Sums of primes :"<<prime_Sums(Arr1,Arr2,len1,len2);
return 0;
}出力
上記のコードを実行すると、次の出力が生成されます。
Distinct Sums of primes :6
この例では、Arr1 = {2, 3, 5} と Arr2 = {2, 2, 4, 7} から作れる素数ペアの合計は 4, 5, 7, 9, 10, 12 の6種類となるため、答えは 6 になります。なお、素数判定のループ範囲を num/2 ではなく sqrt(num) までにすれば、大きな数に対してもより効率的に処理できます。
-
C++で3つのソート済み配列から最も近い3つの要素を効率的に検索する方法
3つのソート済み配列 A、B、C が与えられたとき、それぞれから要素 A[i]、B[j]、C[k] を選び、max(|A[i] − B[j]|、|B[j] − C[k]|、|C[k] − A[i]|) が最小になるような組み合わせを見つける問題を考えてみましょう。例えば、A = [1, 4, 10]、B = [2, 15, 20]、C = [10, 12] の場合、答えは A から 10、B から 15、C から 10 の3つの要素となります。配列 A、B、C のサイズをそれぞれ p、q、r とします。この問題は、配列がすでにソートされていることを利用して、3つのポインタを動かしながら線形時間
-
C++で1からNまでの準素数(Almost Prime)の個数を求める方法
ある数 N が与えられたとき、1からNまでの範囲に含まれる「準素数(almost prime)」の個数を求める問題を考えてみましょう。準素数とは、異なる素因数をちょうど2つ持つ数のことです。素因数以外の約数(合成数の約数)はいくつあっても構いませんが、その中に含まれる素因数は正確に2種類である必要があります。例えば、Nが10の場合、出力は2になります。これは、条件を満たす数が 6(= 2 × 3)と 10(= 2 × 5)の2つしか存在しないためです。アプローチ:エラトステネスの篩を活用するこの問題を効率的に解くには、エラトステネスの篩(Sieve of Eratosthenes)を使って素数