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 )

这是未定义的行为。如果你开始你的 for 循环,1它应该可以解决这个问题。但是,因为N % 1 == 0对于所有N,您可能需要从2.

C99标准来看,6.5.5 /5(不变C11):

/ 运算符的结果是第一个操作数除以第二个操作数的商;% 运算符的结果是余数。在这两种操作中,如果第二个操作数的值为零,则行为未定义。

于 2013-06-06T01:21:57.407 回答
2

You are dividing by zero when number=0;

138816 % number involves division and a remainder.

于 2013-06-06T01:26:55.447 回答