社交数というのは友愛数を拡張したもので、aの約数の和がbに、bの約数の和がcに、cの約数の和がaになるような3数の組を言います。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_ARRAY (10000000)
unsigned long long array[MAX_ARRAY];
int main( int ac, char *av[] )
{
unsigned long long n, n2, n3, i;
/* 配列を初期化する */
for( i = 0; i < MAX_ARRAY; i++ )
array[i] = 0;
/* 約数の和を求める */
for( n = 1; n < MAX_ARRAY / 2; n++ ) {
for( i = 2; i * n < MAX_ARRAY; i++ )
array[i * n] += n;
}
/* 約数の和が互いの数自身になれば友愛数である */
for( n = 1; n < MAX_ARRAY; n++ ) {
n2 = array[n];
if( n2 >= MAX_ARRAY )
continue;
n3 = array[n2];
if( n3 >= MAX_ARRAY )
continue;
if( n < n2 && n < n3 && array[n3] == n )
printf( "%qu %qu %qu\n", n, n2, n3 );
}
}
10000000以下の範囲を調べてみましたが、残念ながら社交数は見つかりませんでした。実は社交数は未だに一組も見つかっていないそうです。だからといって社交数が存在しないと証明されてもいないそうで。ちなみに4数での社交数などは見つかっているそうです。