0

我不明白为什么这个程序没有给出任何输出。我只是看不到错误。这是一个查找 1 到 1000 之间的每一个完美数字的程序。请帮我找出错误。谢谢。

#include <stdio.h>

int main(){
    int number=1, i, sum=0;

    while(number<=1000){

        for(i=1; i<number; i++){
            if(number%i==0){
                sum+=i;
            }
        }

        if(sum==number){
            printf("%d is perfect\n", numero);
        }
        number++;
    }

    return 0;   
}
4

5 回答 5

1

如前所述,您必须sum在循环开始时将 重置为零。
您还必须替换numeronumber(错字)。
为了更进一步,我建议您使用 for 循环而不是 while 循环,恕我直言,我发现它更具可读性。内部 for 循环也可以在i <= number/2优化一点时停止。这是我的代码建议:

#include <stdio.h>

int main(){

    int sum;

    for(int number = 1;number <= 1000; number++){
        sum = 0;

        for (int i = 1; i <= number/2; i++){
            if (number % i == 0){
                sum += i;
            }
        }

        if (sum == number){
            printf("%d is perfect\n", number);
        }
    }

    return 0;
}

输出:

6 is perfect
28 is perfect
496 is perfect
于 2018-08-22T08:30:47.697 回答
0

您没有sum在循环中重置:

#include <stdio.h>

int main(){
    int number=1;

    while(number<=1000){
        int i, sum=0;

        for(i=1; i<number; i++){
            if(number%i==0){
                sum+=i;
            }
        }

        if(sum==number){
            printf("%d is perfect\n", numero);
        }
        number++;
    }

    return 0;

}

根据维基百科,记录在案:

在数论中,一个完美数是一个正整数,它等于其适当的正因数之和,即不包括数字本身的正因数之和(也称为其等分和)。等效地,一个完美数是一个数字,它是其所有正因数(包括它自己)之和的一半,即 σ1(n) = 2n。

于 2018-08-22T08:24:35.700 回答
0

1到1000之间有3个完美数。

{6, 28, 496}

您的代码大部分是正确的,但您忘记在每次循环迭代后重置总和值。

 ...
    }
    number++;
    sum = 0; // set sum to zero at the end of the while loop
  }

而且您将number变量拼错为numero内部printf函数。

printf("%d is perfect\n", numero);
于 2018-08-22T08:32:03.727 回答
0
#include <stdio.h>

int main(){

    int number = 1, sum = 0;

    while(number<=1000){

        sum = 0;
        for(int i = 1; i < number; i++){

            if(number % i == 0){
                sum += i;
            }
        }

        if(sum == number){
            printf("%d is perfect\n", number);
        }
        number++;
    }
    return 0;
}

将 sum 的值重置为 0 并将 numero 更改为 printf 中的数字

于 2018-08-22T08:59:23.127 回答
-1

这段代码工作得很好,只需稍加修改即可接受其他答案中提出的所有建议。

#include<stdio.h>

void main(){

int number = 1;

    while(number <= 1000){
    
       int i, sum = 0; 

       for(i=1; i<number; i++){

          if(number%i == 0){

              sum+=i;               
          }

          if( i == number-1 && sum == number){
             
               //modify the expression within the parenthesis
            
               printf("%d is a perfect number.\n", number);
            
               sum=0;
          }

      }

      number++;

  }

}

输出:

6 is a perfect number.
28 is a perfect number.
496 is a perfect number.

除了其他答案指出的其他错误外,最后一个 if 语句括号内的表达式需要修改。这样做是为了防止包含这样的数字,在这种情况下,因子的总和等于计算所有因子之前的数字。如果保持不变,输出也应包括数字 24。

于 2021-04-16T12:11:13.987 回答