C++で数値が素数に挟まれているかどうかを判定する方法
素数に挟まれた数とは?
「素数に挟まれた数」とは、ある数値の直前の数と直後の数が、どちらも素数であるような数のことを指します。
例えば 642 の場合を見てみましょう。642の直前の数は 641、直後の数は 643 であり、この2つはどちらも素数です。したがって、642は素数に挟まれている数だと言えます。
判定方法は非常にシンプルです。対象となる数を n としたとき、n-1 と n+1 の両方が素数かどうかを確認するだけで済みます。
アルゴリズムの流れ
- 判定したい数値 n を入力として受け取る
- n-1 が素数かどうかを判定する
- n+1 が素数かどうかを判定する
- 両方が素数であれば true、そうでなければ false を返す
C++での実装例
#include <iostream>
#include <set>
#define N 100005
using namespace std;
// 素数判定関数
bool isPrime(int n) {
if (n == 0 || n == 1)
return false;
for (int i = 2; i <= n / 2; i++)
if (n % i == 0)
return false;
return true;
}
// 素数に挟まれているかを判定する関数
bool isSandwichedPrime(int n) {
if (isPrime(n - 1) && isPrime(n + 1))
return true;
return false;
}
int main() {
int n = 642;
if (isSandwichedPrime(n)) {
cout << n << " is Sandwiched between primes: " << n - 1 << " and " << n + 1;
} else {
cout << n << " is not Sandwiched between primes";
}
}
コードの解説
- isPrime関数:引数が0または1の場合は素数ではないため false を返します。その後、2から n/2 までの整数で順番に割り切れるかを確認し、割り切れる数がひとつでもあれば素数ではないと判断します。
- isSandwichedPrime関数:n-1 と n+1 のそれぞれに対して isPrime を呼び出し、両方が素数であれば true を返します。
- main関数:判定したい数値(ここでは642)を渡し、結果に応じてメッセージを出力します。
実行結果
642 is Sandwiched between primes: 641 and 643
まとめ
このように、ある数が素数に挟まれているかどうかは、前後の数が素数であるかをチェックするだけで簡単に判定できます。ただし、上記の isPrime 関数は2から n/2 まで順番に調べるため、計算量は O(n) となります。より大きな数値を扱う場合は、試し割りの範囲を √n まで縮める、あるいはエラトステネスの篩を活用することで、処理を大幅に高速化できます。
-
C++でNが五角数(ペンタゴナル数)かどうかを判定するプログラム
五角数とはある整数 N が与えられたとき、それが五角数(ペンタゴナル数)であるかどうかを判定するのが本記事の目的です。五角数とは、点を並べることで正五角形の形を描くことができる数のことです。これらの数は、五角形を構成する頂点や点として表現できます。五角数の例としては、次のような数列が挙げられます。1, 5, 12, 22, 35, 51, 70, 92 …五角数を判定する公式ある数が五角数かどうかは、以下の公式を利用して確認できます。p(n) = (3 × n² − n) / 2ここで、n は五角形を構成する点の個数を表します。この式から得られる値が順に 1, 5, 12, 22, 35… と
-
アームストロング数を判定するC++プログラムの書き方と解説
アームストロング数とはアームストロング数(Armstrong Number)とは、各桁の数字を「総桁数」乗した値の合計が、元の数そのものと等しくなる数のことです。例えば、153は3桁の数なので、各桁を3乗して足し合わせると元の数に戻ります。主なアームストロング数の例は以下の通りです。3 = 3^1 153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153 371 = 3^3 + 7^3 + 1^3 = 27 + 343 + 1 = 371 407 = 4^3 + 0^3 + 7^3 = 64 + 0 + 343 = 407この性質を利用すると、任意の整数がアームスト