回文素数を求める

2020/3/29作成

回文素数

素数の各桁の数字を入れ替えても素数になるものを回文素数と言います。11, 101などが回文素数です。

以下のプログラムは素数一覧にから回文素数を探索するものです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUF_SIZE  (1024)

int main( void )
{
    long long n, p, tmp;
    char buf[BUF_SIZE];

    /*  回文素数を探す  */
    while( fgets( buf, BUF_SIZE, stdin ) ) {
        if( ( p = strtoll( buf, NULL, 10 ) ) == 0 )
            continue;
        n = 0;
        tmp = p;
        while( tmp != 0 ) {
            n = n * 10 + tmp % 10;
            tmp /= 10;
        }
        if( p == n )
            printf( "%lld\n", p );
    }

    return( 0 );
}

(2026/3/9追記)

int を long long に変更するとともに、ソースコードを少し整理しました。

回文素数の一覧

2, 3, 5, 7 の一桁の素数は当然のことながら回文素数になります。1000以下の回文素数は先ほどの4つに加えて 11, 101, 131, 151, 181, 191, 313, 353, 373, 383, 727, 757, 787, 797, 919, 929 です。偶数桁の回文素数は11以外には存在しないので、10000以下の範囲は1000以下と同じになります。

回文素数の個数

回文素数の個数一覧
範囲 回文素数の個数
10万以下 113個
1000万以下 781個
10億以下 5953個
1000億以下 47,995個
10兆以下 401,696個