C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++入門】エマープ数(Emirp)とは?n以下のエマープ数をすべて出力するプログラム


エマープ数(Emirp number)とは、素数の一種で、その桁を逆順に並べ替えると別の素数になる数のことです。ここでいう「別の素数」とは、元の数と同じ値にならないものを指します。

Emirpは「prime(素数)」を逆から読んだ言葉

すべての素数がエマープ数になるわけではありません。たとえば、回文素数(121のように逆から読んでも同じ数になる素数)や、1桁の素数(2、3、5、7)は、桁を逆にしても同じ数または意味を持たないため、エマープ数には含まれません。

エマープ数の例:13、17、37、733 などがあります。

  • 13 を逆にすると 31(素数)→ エマープ数
  • 17 を逆にすると 71(素数)→ エマープ数
  • 37 を逆にすると 73(素数)→ エマープ数

n以下のエマープ数をすべて出力するプログラム

ここでは、ある数 n が与えられ、n以下のすべてのエマープ数を出力することを目標とします。

具体的な例で問題を確認してみましょう。

入力: n = 40

出力: 13、17、31、37

解決アプローチ

与えられた数以下のすべてのエマープ数を見つけるには、次の手順で処理を行います。

  1. n以下のすべての素数を求める。
  2. 各素数について、桁を逆順に並べ替えた数を作る。
  3. 逆順の数が元の数と異なり、かつ素数であれば、それはエマープ数なので出力する。

nまでの素数を効率よく求め、さらにその逆順の数が素数かどうかを再確認するには、エラトステネスの篩(ふるい)を使うのが最適な方法です。このアルゴリズムを使えば、高速に素数表を作成できます。

解法の動作を示すプログラム

サンプルコード

#include <bits/stdc++.h>
using namespace std;

int reverseDigits(int x) {

    int digitRev = 0;
    while (x > 0)
    {
        digitRev = (digitRev*10) + x%10;
        x = x/10;
    }
    return digitRev;
}

void findAllEmirpNumber(int n) {

    bool primeNo[10001];
    memset(primeNo, true, sizeof(primeNo));

    for (int p=2; p*p<=10001; p++)
    {
        if (primeNo[p] == true)
        {
            for (int i=p*2; i<=10001; i += p)
                primeNo[i] = false;
        }
    }
    for (int p=2; p<=n; p++)
    {
        if (primeNo[p])
        {
            int revNo = reverseDigits(p);
            if (p != revNo && primeNo[revNo]) {
            cout<<p<<"\t";
            if(revNo <= n)
             cout<<revNo<<"\t";
            primeNo[revNo] = false;
            }
        }
    }
}

int main()
{
    int n = 40;
    cout<<"All Emirp numbers less than or equal to "<<n<<" are\n";
    findAllEmirpNumber(n);
    return 0;
}

実行結果

All Emirp numbers less than or equal to 40 are 13 31 17 37

コードのポイント

  • reverseDigits関数: 数値の桁を逆順に並べ替えた整数を返します。剰余演算(%)と除算(/)を繰り返すことで実現しています。
  • findAllEmirpNumber関数: エラトステネスの篩で素数表を作成した後、各素数の逆順の数も素数かどうかをチェックし、エマープ数だけを出力します。
  • 重複防止: 一度出力したペア(例:13と31)を再度出力しないよう、フラグをfalseに設定して管理しています。

  1. C++で五胞体数(ペンタトープ数)を求める方法

    五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の

  2. C++でデューデニー数(Dudeney Number)を判定する方法

    デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ