c语言求1000以内的所有完数问题

img


为什么我的代码运行没有结果?
不明白是哪个地方出错了?
int main()
{ int p,i,sum=0;
printf("1000以内的所有完数为");
for(p=2;p<1000;p++)
{
for(i=1;i
{
if(p%i==0)
{
sum=sum+i;
}
if(p==sum)
{
printf("%d",p);
}
}
}
return 0;
}

2处地方有问题:

  1. 每次开始外层循环时需要将sum重置为0;否则sum会一直累加
  2. 判断因子和是否等于此数的逻辑要移到外层循环中

我给你重新写了一遍,代码见下方。如果对你有帮助,请采纳。

#include <stdio.h>

int main() {
    int p, i, sum;
    printf("1000以内的所有完数为\n");
    for (p = 2; p < 1000; p++) {
        sum = 0;
        for (i = 1; i < p; i++) {
            if (p % i == 0) {
                sum += i;
            }
        }
        if (p == sum) {
            printf("%d ", p);
        }
    }
    return 0;
}

改动处见注释,供参考:

#include <stdio.h>
int main()
{
    int p,i,sum=0;
    printf("1000以内的所有完数为:\n");
    for(p=2;p<1000;p++)
    {
        sum = 0; //sum 需复位
        for(i=1;i<p;i++) //求得数p得因子和
        {
            if(p%i==0)
            {
                sum=sum+i;
            }
        }//这个'}'移动这里
        if(p==sum)
        {
            printf("%d ",p);
        }
    }
    return 0;
}

首先,每次循环后应该初始化sum=0,否则一直用之前的sum加新的因数不能得到想要的结果;第二if(p==sum)的判断应该放在for(i=1;i<p;i++)循环之外,保证循环结束后再判断

img


#include<stdio.h>
int main()
{
    int p,i,sum=0;
    printf("1000以内的所有完数为");
    for(p=2;p<1000;p++){
        sum=0;
        for(i=1;i<p;i++)
            if(p%i==0)
                sum+=i;
        if(p==sum)
            printf("%d ",p);
    }
    return 0;
}

//正确参考答案
#include <stdio.h>

int main()
{
    int num, sum, i;

    for(num = 1; num <= 1000; num ++)
    {
        sum = 0;      //每次判断一个数都要将 sum 初始化为 0
        for (i = 1; i < num; i++)
        {
            if (num % i == 0)   //num 能被 i 整除,说明 i 是 num 的因子
            {
                sum += i;    //累加因子
            }
        }
        if(sum == num)
        {
            printf("%d", num);
        }
    }
    
    return 0;
}