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.