作业是:
编写一个程序,根据输入计算一个数的除数之和。
如果一个数的总和等于该数字(例如: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/