C程序列出完美数字

时间:2016-11-16 05:55:00

标签: c pointers perfect-numbers

我试图对此进行编码,但我无法运行它。请帮我查一下我的代码中的错误。我想要的结果,例子:

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;
    }
}

1 个答案:

答案 0 :(得分: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 的整数类型的大小限制之前),但是您需要以不同的方式处理它。具体来说,请阅读Mersenne primes及其与完美数字的关系,以及梅森数字的Lucas-Lehmer test。需要更多的思考,但令人惊讶的是,没有太多的代码。