Q:

Números perfeitos

algoritmo "numeros_perfeitos"
var
c, n:inteiro
nv, np, npv:real
inicio
para n <- 1 ate 100 faca
  para c <- 1 ate n faca
     se n % c = 0 entao
        nv <- n / c
        se nv < n entao
           np <- nv + np
        fimse
     fimse
  fimpara
  se np = n entao
     escreva(np)
  fimse
  np <- 0
  nv <- 0
fimpara
fimalgoritmo

Eu escrevi esse código para esse exercício:

Escrever um algoritmo que gera e escreve os 4 primeiros números
  perfeitos. Um número perfeito é aquele que é igual a soma dos seus
  divisores. Ex.: 6 = 1+2+3; 28= 1+2+4+7+14.

Porém ele trava quanto coloco de n ate 10000 eu fiz algo errado? E por que ele executa muitos ciclos na estrutura interna (acho que são 100000 ciclos)? Minha logica foi ruim?

A:

Provavelmente está demorando para executar, pois ele vai executar somatório de 1 -> n. Ou seja, para um caso em que N = 10000, ele executa 50005000 vezes esse teu ciclo. Então ele trava, exatamente, por demorar pra executar essa quantidade de loops.
Algumas formas de você melhorar esse algoritmo são:

Sempre que tu encontrar o quarto número perfeito, interromper a execução do laço: faça uma verificação se foram encontrados 4 números, se sim, utilize o comando interrompa no laço mais externo
Você não precisa executar o laço mais interno de 1 até n, mas sim de 2 até n^1/2: Primeiro que 1 sempre dividirá um número, então, ao invés de iniciar a sua soma com 0, você pode iniciar com 1. Segundo que multiplicação é uma operação complementar, então se você sabe um dos fatores, você saberá os dois (em caso de multiplicação de apenas 2 termos), isso significa que você não precisa descobrir TODOS os divisores de N, mas apenas METADE deles, para isso, você tira a raíz quadrada desse número. Feito isso, você tem que somar os dois fatores a sua conta, somando C e N/C, quando N%C = 0.

