作业是:

编写一个程序,根据输入计算一个数的除数之和。

如果一个数的总和等于该数字(例如:6 = 1 + 2 + 3; 28 = 1 + 2 + 4 + 7 +14),则该数字被认为是完美的。

另一个定义:
完美数字是等于其所有正除数(包括其自身)之和的一半的数字

生成前k个完美数(k
这样做的主要问题在于,它混淆了两个实际上没有关联的要点。

在此程序中,我计算了输入数字的除数之和,但我不知道如何将其与第二个点相关(生成第一个k个完美数(k

#include <stdio.h>
#include <stdlib.h>


main()
{
int x,i,y,div,suma,k;
printf("Introduceti numarul\n");          \\enter the number
scanf("%d",&x);
suma=0;                                   \\sum is 0
for(i=1;i<=x;i++)
{

if(x%i==0)
suma=suma+i;                \\sum=sum+i;
}
printf("Suma divizorilor naturali este: %d\n",suma);      \\the sum of the divisors is

for(k=1;k<150;k++)               \\ bad part
{
if (x==suma)
printf("%d",k);
}
}

最佳答案

假设您有一个函数可以判断给定的整数是否完美:

int isPerfect(int);


(功能主体未显示)

现在您的主程序将如下所示:

int candidate;
int perfectNumbers;

for(candidate = 1, perfectNumbers = 0; perfectNumbers < 150; candidate++) {
  if (isPerfect(candidate)) {
    printf("Number %d is perfect\n", candidate);
    perfectNumbers++;
  }
}


编辑
对于没有功能的相同程序:

int candidate;
int perfectNumbers;

for(candidate = 1, perfectNumbers = 0; perfectNumbers < 150; candidate++) {

  [... here your algorithm to compute the sum of the divisors of "candidate" ...]

  if (candidate*2 == sum_of_divisors) {
    printf("Number %d is perfect\n", candidate);
    perfectNumbers++;
  }
}


EDIT2:关于完美数字的注释

如下面的评论部分所述,完美数是非常少见的,截至2014年,仅知道其中的第48个。序列(A000396)的增长也非常快:使用64位整数,您最多可以计算第八个完美数字(碰巧是2,305,843,008,139,952,128)。在这种情况下,变量candidate将环绕并从头开始“查找”“新的”完美数字(直到找到150个:实际上是64位整数中仅有的8个可重复的19个重复)。请注意,尽管您的算法不能扼制等于candidate或负数的0(仅当您将0声明为candidate时才对unsigned int扼流)。

关于c - 关于除数和和完美数的棘手和令人困惑的C程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26786980/

10-11 15:23