素数の各桁の数値を数える

2003/6/9更新

素数の各桁が何種類の数字からなっているかを数えてみます。例えば11は1種類の数字からなっていて、13は2種類からなっているというようにカウントします。

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

int counttype( unsigned long long n );

int main( int ac, char *av[] )
{
	int 	count;
	unsigned long long  n;
	char buf[1024];

	while( fgets( buf, 1024, stdin ) ) {
		n = strtouq( buf, NULL, 10 );
		count = counttype( n );
		printf( "%qu %d\n", n, count );
	}
}


int counttype( unsigned long long n )
{
	int		i, types[10], count;
	char	buf[1024];

	for( i = 0; i < 10; i++ )
		types[i] = 0;

	sprintf( buf, "%qu", n );
	for( i = 0; i < strlen( buf ); i++ )
		types[buf[i] - '0']++;

	count = 0;
	for( i = 0; i < 10; i++ )
		if( types[i] != 0 )
			count++;

	return( count );
}

99999999以下の素数の中で、1種類の数字だけからなるものは2,3,5,7,11だけでした。1桁の場合は必ず1種類なのは当たり前ですから、実質11のみという事になります。1以外の数字が1種類でなる素数は有り得ませんが、111111のような素数がもっとあるかと予想したのですが。

2種類以上は数が多すぎて全てを列挙できませんので、それぞれの素数の数だけを記します。

数字の種類の数 1 2 3 4 5 6 7 8 9 10
5 1087 53901 582793 1896171 2248373 888615 90510 0 0