任务是:
编写一个从输入中计算数字除数之和的程序。
如果它的除数之和等于数字(ex: 6= 1+2+3 ;28 =1+2+4+7 +14),则认为是完全的。
另一个定义:完美数是它所有正除数之和(包括它本身)的一半的数字。
生成第一个k个完美数(k<150)。
这方面的主要问题是混淆了两个问题,这两个问题并没有真正的联系。
在这个程序中,我计算了输入数字的除数之和,但我不知道如何将它与第二个点(生成第一个k个完美数(k<150))联系起来。
#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);
}
}发布于 2014-11-06 19:01:12
假设您有一个函数,它可以判断给定的整数是否完美:
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位整数,您将能够计算到第8个完美数(恰好是2,305,843,008,139,952,128)。在这种情况下,变量candidate将从一开始就开始“查找”“新”完美数字(直到找到其中的150个:实际上,在64位整数中只有8个可找到的重复数)。不过,请注意,您的算法不能被candidate限制为等于0或负数(如果您将candidate声明为unsigned int,则仅限于0 )。
发布于 2014-11-06 18:43:46
我把这个问题解释为生成所有150以下的数字,这些数字可能是完美的数字。
因此,如果您的程序用于计算完美数字,则一直计算它们,直到起始数为>= 150。
希望这是合理的。
发布于 2014-11-06 20:01:39
这是我的解决方案..。
首先,你必须制定一个可靠的方法来获得分区。
我为此设计了一个功能:
size_t
getdivisors(num, divisors)
long long num;
long long *divisors;
{
size_t divs = 0;
for(long long i = num; i > 0; --i)
if (num%i == 0)
divisors[divs++] = i;
return divs;
}其次,您需要检查数字的除数器是否与完美数字的除数属性匹配(它们的和是数字的一半)。
下面是第二个函数:
bool
isperfect(num)
long long num;
{
long long divisors[num/2+1];
size_t divs = getdivisors(num, divisors);
if (divs == 0)
return false;
long long n = 0;
for(int i = 1; i < divs; ++i)
n += divisors[i];
return (n == num);
}现在,从你的问题,我认为你需要打印所有的完美数字少于150,对吗?
见此:
int
main(argc, argv)
int argc;
char ** argv;
{
for(int i = 1; i < 150; ++i)
if (isperfect(i))
printf("%d is perfect.\n", i);
return 0;
}我希望这能回答你的问题。
https://stackoverflow.com/questions/26786980
复制相似问题