最新情報をお届けします。
ある数の、それ自身を除く約数の和が、
その数自身と等しい自然数を完全数といいます。
子供に「博士の愛した数式」を貸したところ、
完全数が出てきたので、ちょっとプログラミングしてみました。
------test.c--------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
main()
{
long max=10000,kazu,yakusu,sho,yakusu_max,yakusu_wa;
for (kazu=2;kazu<max;kazu++)
yakusu_max=(long)sqrt(kazu);
yakusu_wa=1;
for (yakusu=2;yakusu<=yakusu_max;yakusu++)
{
sho=(long)(kazu/yakusu);
if ( sho * yakusu == kazu )
{
yakusu_wa+=yakusu;
if ( sho != yakusu ) yakusu_wa+=sho;
}
}
if ( yakusu_wa == kazu ) printf("%ld\r\n",kazu);
}
}
--------------------------------------------------------
>gcc test test.c -lm
>time test
6
28
496
8128
real 0m0.189s
えっ、こんなに速いの!わずか0.2秒とは。
30年ほど前に、中型コンピュータでFORTRANで計算したとは、1000だか
10000だかまで調べるのに軽く5分はかかっていたのに。
ちなみにPCで、10億までを調べたら、丸一日かかりました。
その間に見つかったのは、33550336。
次は85億あたりにあるそうですが、longでは限界のようです。
ある数の、それ自身を除く約数の和が、
その数自身と等しい自然数を完全数といいます。
子供に「博士の愛した数式」を貸したところ、
完全数が出てきたので、ちょっとプログラミングしてみました。
------test.c--------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
main()
{
long max=10000,kazu,yakusu,sho,yakusu_max,yakusu_wa;
for (kazu=2;kazu<max;kazu++)
yakusu_max=(long)sqrt(kazu);
yakusu_wa=1;
for (yakusu=2;yakusu<=yakusu_max;yakusu++)
{
sho=(long)(kazu/yakusu);
if ( sho * yakusu == kazu )
{
yakusu_wa+=yakusu;
if ( sho != yakusu ) yakusu_wa+=sho;
}
}
if ( yakusu_wa == kazu ) printf("%ld\r\n",kazu);
}
}
--------------------------------------------------------
>gcc test test.c -lm
>time test
6
28
496
8128
real 0m0.189s
えっ、こんなに速いの!わずか0.2秒とは。
30年ほど前に、中型コンピュータでFORTRANで計算したとは、1000だか
10000だかまで調べるのに軽く5分はかかっていたのに。
ちなみにPCで、10億までを調べたら、丸一日かかりました。
その間に見つかったのは、33550336。
次は85億あたりにあるそうですが、longでは限界のようです。