C++でNより大きい最小の素数回文を求めるアルゴリズムと実装
整数 N が与えられたとき、N より大きい最小の素数回文を求めるのがこの記事のテーマです。素数回文(Prime Palindrome)とは、素数であり、かつ回文(前から読んでも後ろから読んでも同じ並びになる数)でもある数のことです。まずは具体例を見てみましょう。
入力
N = 10
出力
11
10 の次の素数は 11 ですが、11 は「1・1」と前後どちらから読んでも同じ数、つまり回文でもあるため、答えは 11 になります。
アルゴリズム
基準となる数値 N を初期化します。
与えられた数が素数かどうかを判定する関数
isPrimeを用意します。与えられた数が回文かどうかを判定する関数
isPalindromeを用意します。N + 1 から順に候補の数を 1 ずつ増やしながら調べ、素数かつ回文である数が見つかった時点でその値を返します。
C++での実装
以下が、上記アルゴリズムを C++ で実装した例です。
#include <bits/stdc++.h>
using namespace std;
// 素数判定:√n までの数で割り切れるかを確認
bool isPrime(int n) {
if (n < 2) return false;
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) return false;
}
return true;
}
// 回文判定:数値を反転して元の数と比較
bool isPalindrome(int n) {
int num = n, digit, rev = 0;
while (num) {
digit = num % 10;
rev = (rev * 10) + digit;
num /= 10;
}
return n == rev;
}
// Nより大きい最小の素数回文を返す
int getNextSmallestPrimePalindrome(int n) {
int i = n + 1;
while (true) {
if (isPrime(i) && isPalindrome(i)) {
return i;
}
i += 1;
}
}
int main() {
int N = 15;
cout << getNextSmallestPrimePalindrome(N) << endl;
return 0;
}
出力
上記のコードを実行すると、次の結果が出力されます。
101
N = 15 の場合は少し注意が必要です。17 や 19 は素数ですが回文ではないため候補外となり、22 や 33 のような偶数桁の回文はすべて 11 の倍数になるため素数にはなりません。そのため、素数かつ回文を同時に満たす最初の数は 101 となります。
探索を高速化するポイント
単純な全探索でも正しい答えは得られますが、N が大きくなると処理に時間がかかります。次のような工夫で効率化できます。
偶数桁の回文をスキップする: 偶数桁の回文(11 以外)は必ず 11 の倍数になるため素数ではありません。奇数桁の回文だけを生成して判定すれば、無駄な探索を大幅に減らせます。
素数判定の計算量を意識する: 素数判定は 2 から √n まで試し割りできれば十分で、O(√n) で判定できます。
-
C++で素数トリプレット(三つ組の素数)をすべて求める方法
問題の概要この問題では、ある数値 N が与えられ、N未満のすべての素数トリプレットを見つけて出力することが求められます。素数トリプレットとは素数トリプレットとは、3つの素数からなる組のことで、次のいずれかの形で表されます。(p, p+2, p+6)(p, p+4, p+6)5以上の素数は必ず「6k±1」の形で表されるため、素数はこのパターンに従って三つ組にグループ化されます。入出力例入力:N = 13 出力:5 7 11解法のアプローチこの問題を解くには、まずN以下のすべての素数を求め、その後トリプレットの条件に合致するかどうかを確認します。素数の列挙にはエラトステネスの篩を用いることで、効率
-
C++でn番目の平衡素数(バランス素数)を求める方法
平衡素数とは 平衡素数(Balanced Prime)とは、直前の素数と直後の素数までの距離(差)が等しい素数のことです。言い換えれば、前後にある最も近い素数の平均値に一致する素数を指します。 ある素数が平衡素数であるためには、次の式を満たす必要があります。 Pn = (Pn-1 + Pn+1) / 2 ここで、nは順序付けられた素数列におけるPnのインデックス(順位)を表します。 素数の順序付き集合:2, 3, 5, 7, 11, 13, … 最初のいくつかの平衡素数は、5, 53, 157, 173, … です。 問題の概要 この問題では、数値nが与えられ、n番目の平衡素数を求めることが