我试图对此进行编码,但我无法运行它。请帮我查一下我的代码中的错误。我想要的结果,例子:
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;
}
}
答案 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。需要更多的思考,但令人惊讶的是,没有太多的代码。