程序查找数字是否完美

时间:2018-08-21 18:01:22

标签: c

我在尝试运行该程序时遇到了麻烦,我发现该程序是否完美。它给了我一个细分错误。这意味着什么?您能帮我了解我做错了什么吗?这是我的代码:

#include <stdio.h>

void perfect(int number);

int main() {
    int n;

    printf("Insert a number greater than 0: ");
    scanf("%d", &n);

    perfect(n);

    return 0;
}

void perfect(int number) {
    int i, j, array[100], k = 0, tmp = 0, tmp2 = number;

    for (i = 2; i <= 1000; i++) {
        for (j = 2; j <= 1000; j++) {
            if (i % j == 0) {
                array[k] = i;
                k++;
            }
        }
    }
    k = 0;

    while (tmp2 != 1) {
        if (tmp2 % array[k] == 0) {
            tmp += array[k];
            tmp2 /= array[k];
        }
        k++;
    }

    tmp++;
    if (tmp == tmp2) {
        printf("It's a perfect number\n");
    }
}

2 个答案:

答案 0 :(得分:2)

分段错误告诉您您正在尝试访问超出允许范围的内存。您的数组远远不能满足程序的需求。

您需要重新考虑数组中存储的内容。所有不超过一千的数字都可以被其他数字整除,对吗?但实际上它将是

  • 所有
  • 所有偶数
  • 所有可被3
  • 整除的元素
  • 所有可被4整除的东西。

听起来很多,不是100个吗?我还会怀疑您打算重复很多很多次。例如,您将存储6 3次,因为它可以被2、3及其本身整除。 (所以,顺便说一下,一旦j大于i,就应该停止寻找。)

您的while循环也很特殊。它在tmp2为1时终止。tmp如何等于1?

恐怕回到绘图板上!

答案 1 :(得分:0)

鉴于循环索引最大值1000,数组array的大小至少应为1001。大小为100时,您可能会发生缓冲区溢出,从而导致未定义的行为。