1

完全数を求めるプログラムを書いています。これらの完全数について読んだ後、それらのリストに出くわしました:完全数のリスト. 現時点での出力は次のとおりです。

28         // perfect
496        // perfect
8128       // perfect
130816     // not perfect
2096128    // not perfect
33550336   // perfect

私は配列を作成し、それを数字で配置することにしました。これは、数字を完全に(残りなしで)分割します。したがって、配列のすべての要素を追加することで、完全数かどうかを確認できます。しかし、アプリがクラッシュし、その理由がわかりません:

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

int main()
{
    unsigned long number;
    unsigned long arr2[100] = {0};
    int k = 0;

    for ( number = 0; number <= 130816; number++ )
        if ( 130816 % number == 0 )
            arr2[k++] = number;

    for ( k = 0; k < 100; k++ )
        printf("%lu", arr2[k]);

    return 0;
}
4

2 に答える 2

4

ここでモジュラスを実行していzeroます:

if ( 130816 % number == 0 )

これは未定義の動作です。1代わりにfor ループを開始すると、その問題が修正されるはずです。ただし、N % 1 == 0すべての についてはN、おそらく から開始する必要があります2

C99標準より(では6.5.5 /5変更なしC11):

/ 演算子の結果は、最初のオペランドを 2 番目のオペランドで割った商です。% 演算子の結果は剰余です。どちらの操作でも、2 番目のオペランドの値がゼロの場合、動作は未定義です。

于 2013-06-06T01:21:57.407 に答える
2

number=0 の場合、0 で割っています。

138816 % number割り算と余りが含まれます。

于 2013-06-06T01:26:55.447 に答える