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 がそれぞれ素数かどうかを個別に判定していくことです。この方法は実装が簡単ですが、同じ数に対して何度も素数判定を繰り返すため計算コストが高く、大規模な入力では処理が重くなるという欠点があります。
2. 効率的なアプローチ(エラトステネスの篩)
より効率的なのが、エラトステネスの篩を利用する方法です。あらかじめ一定範囲までのすべての素数を求めて配列に格納しておけば、各数値が素数かどうかを O(1) で判定できます。あとは配列を走査しながら、p、p+2、p+6、p+8 の4つがすべて素数である場合に出力するだけです。
C++による実装例
#include <bits/stdc++.h>
using namespace std;
#define MAX 100000
bool prime[MAX];
void primeNumberGenerator() {
memset(prime, true, sizeof(prime));
for (int p = 2; p * p < MAX; p++) {
if (prime[p] == true) {
for (int i = p * 2; i < MAX; i += p)
prime[i] = false;
}
}
}
void printPrimeQuadruplet(int n) {
for (int i = 0; i < n - 7; i++) {
if (prime[i] && prime[i + 2] && prime[i + 6] && prime[i + 8]) {
cout<<i<<" "<<i+2<<" "<<i+6<<" "<<i+8<<endl;
}
}
}
int main() {
primeNumberGenerator();
int n = 42;
cout<<"All prime Quadruplets are :\n";
printPrimeQuadruplet(20);
return 0;
}
コードのポイント
- primeNumberGenerator():エラトステネスの篩を実装した関数です。bool 型配列を使い、MAX 未満のすべての整数について素数かどうかを事前に記録します。
- printPrimeQuadruplet(n):i + 8 が n を超えないようにループ範囲を制御し、i、i+2、i+6、i+8 の4つがすべて素数の場合に四つ組として出力します。
実行結果
上記のコードを実行すると、次の出力が得られます。
5 7 11 13 11 13 17 19
このように、エラトステネスの篩で素数表を事前構築しておくことで、N 以下のすべての素数四つ組を効率よく列挙できます。
-
C++で最小ヒープから値x未満のすべてのノードを出力する方法
この問題では、最小ヒープ(Min Heap)と値xが与えられ、xより小さい値を持つすべてのノードを出力することが求められます。最小ヒープとは、すべての親ノードがその子ノードの値以下となる特殊な二分木です。この性質により、根(ルート)には常にヒープ内の最小値が格納されます。具体例を使って問題を理解しましょう。X = 45出力 − 2 4 7 10 17 22 33 34この問題を解くには、最小ヒープ全体を先行順トラバーサル(前順走査)で探索し、与えられた値xより小さい値を持つノードのみを出力します。アルゴリズムのポイント最小ヒープでは親ノードの値が必ず子ノード以下であるため、あるノードの値がx以
-
C++である数が別の数のすべての素因数で割り切れるかどうかを判定する方法
問題の概要 2つの整数が与えられたとき、一方の数がもう一方の数のすべての素因数で割り切れるかどうかを判定します。 例として、ある数が 120 の場合、その素因数は {2, 3, 5} です。もう一方の数が 75 であれば、その素因数は {3, 5} となります。120 は 3 でも 5 でも割り切れるため、この場合の答えは「Yes」です。 アルゴリズムの考え方 この問題は、最大公約数(GCD)を利用することで効率的に解くことができます。手順は以下の通りです。 もし相手の数が 1 であれば、素因数を一切持たないため、答えは常に true になります。 それ以外の場合は、まず2つの数の GCD