首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于除数和完全数的复杂而混乱的C程序

关于除数和完全数的复杂而混乱的C程序
EN

Stack Overflow用户
提问于 2014-11-06 18:40:42
回答 3查看 1.1K关注 0票数 0

任务是:

编写一个从输入中计算数字除数之和的程序。

如果它的除数之和等于数字(ex: 6= 1+2+3 ;28 =1+2+4+7 +14),则认为是完全的。

另一个定义:完美数是它所有正除数之和(包括它本身)的一半的数字。

生成第一个k个完美数(k<150)。

这方面的主要问题是混淆了两个问题,这两个问题并没有真正的联系。

在这个程序中,我计算了输入数字的除数之和,但我不知道如何将它与第二个点(生成第一个k个完美数(k<150))联系起来。

代码语言:javascript
复制
#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);
}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-06 19:01:12

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

代码语言:javascript
复制
int isPerfect(int);

(功能体未显示)

现在,您的主要程序将是:

代码语言:javascript
复制
int candidate;
int perfectNumbers;

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

编辑同一程序的,没有功能:

代码语言:javascript
复制
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 )。

票数 1
EN

Stack Overflow用户

发布于 2014-11-06 18:43:46

我把这个问题解释为生成所有150以下的数字,这些数字可能是完美的数字。

因此,如果您的程序用于计算完美数字,则一直计算它们,直到起始数为>= 150

希望这是合理的。

票数 0
EN

Stack Overflow用户

发布于 2014-11-06 20:01:39

这是我的解决方案..。

首先,你必须制定一个可靠的方法来获得分区。

我为此设计了一个功能:

代码语言:javascript
复制
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;
}

其次,您需要检查数字的除数器是否与完美数字的除数属性匹配(它们的和是数字的一半)。

下面是第二个函数:

代码语言:javascript
复制
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,对吗?

见此:

代码语言:javascript
复制
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;
}

我希望这能回答你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26786980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档