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!