Ajuda de numéros perfeitos

Eu preciso de uma ajuda para fazer o seguinte,escrever um programa que leia um número e diga se ele é perfeito. Um número perfeito é aquele que é igual à soma dos seus divisores. Exemplos: 6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14. A saída do programa deve ser uma frase do tipo: “O número NUMERO (não) é perfeito, pois possui os seguintes divisores: DIVISORES.”.

só que estou sem idéias de como fazer ele.qualquer ajuda eu agradeço desde já !!

O primeiro algoritmo que me vem na cabeça é iterar de 1 até o número, somando seus divisores numa variável e, no final, comparar se a soma é igual ao número. O problema é que esse algoritmo pode ser bem ineficiente para números grandes.

Algumas dicas para melhorar a velocidade:

Se o número N qualquer é par, o último divisor dele (com exceção dele mesmo) vai ser sua metade. Por exemplo: iterando a partir de 1, o último divisor de 10 vai ser 5. Qualquer número além de 5 não divide 10. O mesmo acontece para qualquer outro numero par. Com isso, você divide pela metade o trabalho, se itera até N/2, e não até N.

O mesmo acontece para os números ímpares, com a diferença de que sua metade não pode ser considerada um divisor, pois não é inteira. Por exemplo, se N é 7, N/2 é 3.5, o que descaracteriza a ideia de números perfeitos e divisores inteiros.

Pseudo-código da solução ingênua:

n = candidatoANumeroPerfeito
divisores = listaVazia
soma = 0
dado i de 1 ate n - 1:
    se (n % i == 0) // se a divisão de n por i não deixa resto
        soma += i;
        divisores.adiciona(i)
    fim se
fim loop
se soma == n
    print 'Numero eh perfeito'
senao
    print 'Numero nao eh perfeito. Divisores: ' + divisores
fim se

Você pode também só ir adicionando na lista e somar no final, tanto faz.

É apenas um outline da ideia! Adaptar pra melhorar a velocidade não deve ser difícil.

Espero ter ajudado!

e como fica esse algoritmo em php,o qual estou necessitando tentei fazer aqui mas não deu muito certo

    <?php

$n=$_POST["n"]; 
$divisores = null;
$soma = 0;
for($i=1;$i<($n-1);$i++){
    if ($n % $i == 0) {
        $soma += $i;
        $divisores;
    }

if ($soma == $n){
    echo "Numero eh perfeito";
}else{
    echo "Numero nao eh perfeito. Divisores: " + $divisores;
}
}
?>

Seria algo +/- assim:

$numero = $_POST['numero']; # capturou numero passado via POST
$divisores = array();
$soma = 0;

for ($i=1; $i < $numero; $i++) {
  if($numero % $i == 0){
    $soma += $i;
    array_push($divisores, $i);
  }

}

echo "Numero: $numero, Soma dos divisores: $soma <br>";

if($soma == $numero)
  echo "O número é perfeito";
else
  echo "O número não é perfeito.\nDivisores: " . implode(", ", $divisores);

Saída para entrada do número 18:

Numero: 18, Soma dos divisores: 21
O número não é perfeito. Divisores: 1, 2, 3, 6, 9

so não entendi a parte dos divisores “divisores.adiciona(i)”

Editei a resposta acima, dê uma olhada agora.
Basicamente você adiciona todos os divisores em um array.

vlw por me ajudar