C++で合計が素数かつn未満となるペアの個数を数える方法
正の整数 n が入力として与えられます。この記事の目的は、合計 (i + j) が素数であり、かつ n 未満となるペア (i, j) の個数を求めることです。ここで、i ≠ j かつ i, j ≥ 1 という条件を満たす必要があります。
例として、n が 4 の場合を考えてみましょう。このとき条件を満たすペアは (1, 2) の 1 つだけです。1 + 2 = 3 は素数であり、4 未満だからです。また、1 と 2 はどちらも 1 以上の条件を満たしています。
それでは、具体例を使って理解を深めましょう。
入力 − n = 7
出力 − 合計が素数かつ n 未満となるペアの数 − 3
説明 − 該当するペアは (1, 2)、(1, 4)、(2, 3) です。合計の 3、5、5 はいずれも素数であり、7 未満です。
入力 − n = 10
出力 − 合計が素数かつ n 未満となるペアの数 − 6
説明 − 該当するペアは (1, 2)、(1, 4)、(2, 3)、(1, 6)、(2, 5)、(3, 4) です。合計の 3、5、5、7、7、7 はいずれも素数であり、10 未満です。
プログラムで使用するアプローチ
このアプローチでは、まず関数 check_prime(bool check[], int temp) の中で「サンダラムの篩(Sieve of Sundaram)」を用いて、n 未満のすべての素数を求めます。サンダラムの篩は、(i + j + 2ij) の形式の数を除外していくことで素数を導き出すアルゴリズムです。
さらに、各奇数 temp について、合計が temp となる異なるペアの個数は temp / 2 であるという性質を利用します。
2 を除くすべての素数は奇数であるため、n 未満の素数が見つかるたびに、count に temp / 2 を加算していけばよいことになります。
- 変数 n を入力として受け取ります。
- 関数 prime_pair(int n) は n を受け取り、合計が素数かつ n 未満となるペアの個数を返します。
- カウント用変数 count を 0 で初期化します。
- サンダラムの篩は入力 n に対して 2*n + 2 未満の素数を生成するため、n を半分にした値を temp_2 に格納します。
- 長さ temp_2 の配列 check[] を作成し、(i + j + 2*i*j) の形式の数値を true としてマークできるようにします。すべての要素は false で初期化します。
- 関数 check_prime(bool check[], int temp) では、(i + j + 2*i*j) の形式で、その合計が temp 以下となる数値に対して check[] を true に設定します。
- for ループでインデックス i = 1 から i ≤ temp_2 まで配列 check[] を走査します。
- check[i] が false の場合、対応する素数は temp = 2*i + 1 となります。
- 合計が temp になるペアの個数は temp / 2 なので、count に temp / 2 を加算します。
- for ループが終了した時点で、合計が素数かつ n 未満となるペアの総数が得られます。
- count を結果として返します。
コード例
#include <bits/stdc++.h>
using namespace std;
void check_prime(bool check[], int temp){
for (int i=1; i<=temp; i++){
for (int j=i; (i + j + 2*i*j) <= temp; j++){
check[i + j + 2*i*j] = true;
}
}
}
int prime_pair(int n){
int count = 0;
int temp;
int temp_2 = (n-2)/2;
bool check[temp_2 + 1];
memset(check, false, sizeof(check));
check_prime(check, temp_2);
for (int i=1; i <= temp_2; i++){
if (check[i] == false){
temp = 2*i + 1;
count += (temp / 2);
}
}
return count;
}
int main(){
int n = 10;
cout<<"Count of pairs with sum as a prime number and less than n are: " <<prime_pair(n);
return 0;
}出力
上記のコードを実行すると、以下の出力が得られます。
Count of pairs with sum as a prime number and less than n are: 6
-
C++で指定した数以下のすべての素数四つ組を出力する方法
この記事では、正の整数 N が与えられたとき、N 以下に存在するすべての「素数四つ組」を見つけて出力する方法を解説します。 素数四つ組とは? 素数四つ組とは、{p, p+2, p+6, p+8} という形で表される4つの素数の集合のことです。代表例として、「5、7、11、13」の組み合わせが挙げられます。 具体例を使って問題を確認してみましょう。 入力:N = 15 出力:5 7 11 13 解法アプローチ 1. 単純なアプローチ 最もシンプルな方法は、すべての候補 p に対して、p、p+2、p+6、p+8 がそれぞれ素数かどうかを個別に判定していくことです。この方法は実装が簡単です
-
C++でY以下となる数値集合の最小個数を求めるアルゴリズム
問題の概要連続した数字からなる文字列と数値 Y が与えられます。このとき、以下のルールをすべて満たす集合の最小個数を求めるのが課題です。各集合は、元の文字列から連続して取り出した数字で構成すること同じ桁(文字)を複数回使用してはならない集合内の数値は Y を超えてはならない入力例と出力例たとえば、str = 1234、Y = 20 とすると、次のように 3 つの集合に分割できるため、答えは 3 になります。{12}, {3}, {4}{12} は 20 以下であり、{3} と {4} もそれぞれ 20 以下です。すべての数字が一度ずつ使われていることも確認できます。アルゴリズムこの問題は貪欲法