/* 
   Programa que determina se um numero e' perfeito 

   Um numero natural n eh dito perfeito se ele for igual a soma dos seus 
   divisores e diferentes de n. Por exemplo, 6 eh perfeito, pois 

   6 = 1 + 2 + 3

   O programa em C abaixo determina todos os numeros perfeitos de 1 a 1000.

*/
#include <stdio.h>

int main() {
  int n,       /* numero natural a ser verificado */
    soma,      /* soma dos divisores de n         */
    divisor;   /* candidato a divisor de n        */

  n = 1; /* inicializacao de n antes de entrar no laco */

  while (n<=1000){ /* laco do tipo while para varrer os 1000 primeiros naturais */

    soma = 0; /* inicializacao da soma de divisores de n */
  
    divisor = 1; /* primeiro divisor possivel */

    while (divisor<=n/2){ /* laco do tipo while sobre os candidatos a divisores. Perceba que 
			    para qualquer numero natural n, nao ha divisores entre n/2 e n, 
			    excluindo os extremos */

      if (n % divisor == 0) /* teste de divisibilidade */
	soma = soma + divisor; /* Se o teste eh positivo, incremente a soma de divisores */

      divisor = divisor + 1; /* passe para o proximo candidato a divisor */

    } /* fim do laco sobre candidatos a divisores */
  
    if (n == soma) /* teste de perfeicao. Se positivo, imprima uma mensagem na tela */
      printf("O numero %d eh perfeito\n", n);
    
    n = n + 1; /* atualizacao do numero a ser testado */

  }

  return 0;

}
