C言語関係掲示板

過去ログ

No.1183 完全数を求めるプログラム

[戻る] [ホームページ]
No.15479

完全数を求めるプログラム
投稿者---たけだ(2004/07/13 12:43:16)


1000までの完全数(6=1+2+3など)を配列を使わないで求めたい。
無理ですかね?


No.15480

Re:完全数を求めるプログラム
投稿者---nop(2004/07/13 12:51:02)


>無理ですかね?

おそらく出来ると思われる。



No.15483

Re:完全数を求めるプログラム
投稿者---たいちう(2004/07/13 13:18:29)


>>無理ですかね?
>おそらく出来ると思われる。

むしろ素直に作ったら配列を使わないのではないかい?


No.15487

Re:完全数を求めるプログラム
投稿者---NykR(2004/07/13 17:26:42)


>1000までの完全数(6=1+2+3など)を配列を使わないで求めたい。
>無理ですかね?

配列なんて何に使うんですか?

といいつつ、配列を使ったら多分こんな感じ。
#include <stdio.h>
#define  SIZE (1<<5)

int main()
{
    int isComposite[SIZE] = { !0,!0, }, i, j;

    for(i = 0; i * i <= SIZE; i++)
        if( !(isComposite[i]) )
            for(j = i + i; j < SIZE; j += i) isComposite[j] = !0;

    for(i = 0; i < SIZE; i++)
        if( !(isComposite[i]) & !(i & (i+1)) ) printf("%d\n", i / 2 * i + i);

    return 0;
}

で、1000以下なら篩のサイズは25あれば足りるので、
配列の代わりに32ビット整数を使うこともできます。


No.15498

Re:完全数を求めるプログラム
投稿者---かずま(2004/07/13 23:00:49)


ある数 n の約数(n を除く)の和 s が n に等しければ、n は完全数。
素直に書けば、
    s = 1;
    for (i = 2; i < n; i++)
        if (n % i == 0) s += i;
    if (s == n) printf("%d\n", n);
どこが難しいのかを説明してください。
約数を求める方法を思いつかなかったのでしょうか?