-6

我试图对此进行编码,但我无法运行它。请帮我检查我的代码有什么问题。我想要的结果,例子:

The List of Perfect Number
Give me the lastest number(start from 1): 100
6 28

这是一个使用指针的C程序:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int i, x, n, *sum;

    printf("The List of Perfect Number\n");
    printf("Give me the lastest number(start from 1):  ");
    scanf("%d", &n);

    sum = (int *) malloc(sizeof(int));
    *sum = 0;

    for(x=1;x<=n;x++)
    {
        for(i=1; i<x; i++)
        {
            if(x%i == 0)
            {
                *sum+=i;
            }
        }
        if(*sum == x)
            printf("%d", x);
        free(sum);
     return 0;
    }
}
4

1 回答 1

1

好消息是你有大部分你需要的语句,你只是有几个以错误的顺序排列(并扔掉指针的东西——这是数学!):

#include <stdio.h>

int main()
{
    unsigned n;

    printf("The List of Perfect Number\n");
    printf("Give me the lastest number (start from 1): ");

    (void) scanf("%u", &n);

    for (unsigned x = 1; x <= n; x++)
    {
        unsigned sum = 0;

        for (unsigned i = 1; i <= x / 2; i++)
        {
            if (x % i == 0)
            {
                sum += i;
            }
        }

        if (sum == x)
        {
            printf("%d\n", x);
        }
    }

    return 0;
}

坏消息是,由于性能不佳,使用这样的代码你不会得到超过四个完美的数字。可以在合理的时间内计算两倍的数量(在遇到C的整数类型的大小限制之前),但您需要以不同的方式处理它。具体来说,阅读梅森素数及其与完美数的关系,以及梅森数的Lucas-Lehmer 检验。这需要更多的思考,但令人惊讶的是,没有太多的代码。

于 2016-11-16T08:24:38.023 回答