首页 > 解决方案 > 找出一个数字是否完美的程序

问题描述

我在尝试运行这个程序时遇到了麻烦,这个程序是我用来查找一个数字是否完美的。它给了我一个分割错误。这意味着什么?你能帮我理解我做错了什么吗?这是我的代码:

#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");
    }
}

标签: c

解决方案


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

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

  • 所有这些
  • 所有偶数
  • 所有能被 3 整除的
  • 所有这些都可以被 4 整除,等等。

这听起来比 100 多很多,不是吗?还会有很多很多重复,我怀疑你打算这样做。例如,您将存储 6 三倍,因为它可以被 2、3 和自身整除。(所以,顺便说一下,一旦 j 大于 i,你就应该停止查找。)

您的 while 循环也很奇特。它在 tmp2 为 1 时终止。tmp 怎么会等于 1?

回到绘图板,我害怕!


推荐阅读