Números Perfeitos em PHP: Como Descobrir e Gerar (Exercício Resolvido)

Números Perfeitos em PHP: Lógica e Funções na Prática 

Neste tutorial do nosso Curso de PHP, vamos resolver a incrível Questão 7 da nossa lista de exercícios sobre funções.

"Um número é dito perfeito quando ele é igual à soma de todos os seus divisores próprios (excluindo ele mesmo). Escreva um programa em PHP com funções que receba um número, diga se ele é perfeito e, em seguida, liste todos os números perfeitos até esse limite."

1. A Matemática: O que é um Número Perfeito?

Antes de programar, precisamos entender a regra do jogo. Pegue o número 6. Por quais números podemos dividir o 6 de forma exata (sem sobrar resto)? Podemos dividi-lo por 1, por 2 e por 3.

Agora, some esses divisores:

$$6 = 1 + 2 + 3$$

Como a soma dos divisores resulta exatamente no próprio número, o 6 é um Número Perfeito! Veja outro exemplo famoso, o número 28. Seus divisores são 1, 2, 4, 7 e 14. Se somarmos:

$$28 = 1 + 2 + 4 + 7 + 14$$

Temos outro número perfeito! Os próximos são 496 e 8128. Acredite se quiser, eles são muito raros. Até hoje, os matemáticos não sabem se existe algum número perfeito ímpar ou se eles são infinitos!

2. A Lógica de Programação

Como transformar isso em código PHP? Vamos criar uma função chamada somaDivisores($n). Dentro dela:

  1. Criamos uma variável $soma = 0 para acumular os valores.
  2. Usamos um laço for que começa no 1 e vai até $n - 1.
  3. Dentro do laço, usamos o Operador Módulo (%). Se $n % $i == 0, significa que a divisão é exata. Se for exata, nós adicionamos esse $i na nossa variável $soma.
  4. No final, retornamos a soma. Se o retorno for igual ao número original, EUREKA! É perfeito.

3. O Código PHP Completo e Funcional

Preparamos um código visualmente atraente onde o usuário digita um número. O sistema dirá se aquele número é perfeito e, de bônus, vai varrer e imprimir todos os números perfeitos que existem do 1 até o número que você digitou!

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Detector de Números Perfeitos - PHP</title>
    <style>
        .container { max-width: 500px; margin: 30px auto; font-family: sans-serif; text-align: center; border: 2px solid #cbd5e1; padding: 30px; border-radius: 10px; background: #f8fafc; }
        input[type="number"] { padding: 10px; font-size: 16px; width: 80%; margin-bottom: 15px; border-radius: 5px; border: 1px solid #94a3b8; text-align: center;}
        .btn { background: #10b981; color: white; border: none; padding: 10px 20px; font-size: 16px; border-radius: 5px; cursor: pointer; font-weight: bold; width: 85%; }
        .btn:hover { background: #059669; }
        .resultado { margin-top: 20px; padding: 15px; border-radius: 5px; background: #e0f2fe; color: #0369a1; border: 1px solid #7dd3fc; text-align: left; }
    </style>
</head>
<body>

<div class="container">
    <h2>✨ É um Número Perfeito?</h2>
    <form action="" method="get">
        <input type="number" name="numero" min="1" max="10000" placeholder="Digite um número (ex: 28)" required>
        <button type="submit" class="btn">Verificar e Buscar</button>
    </form>

    <?php
    // FUNÇÃO: Calcula a soma dos divisores de um número
    function somaDivisores($n) {
        $soma = 0;
        // Divide o número por todos os anteriores a ele
        for($i = 1; $i < $n; $i++) {
            if($n % $i == 0) { // Se o resto for 0, é divisor!
                $soma += $i;
            }
        }
        return $soma;
    }

    // Verifica se o usuário enviou o formulário
    if(isset($_GET['numero'])) {
        $num_usuario = intval($_GET['numero']);
        
        echo "<div class='resultado'>";
        
        // 1. Testa se o número digitado é perfeito
        if($num_usuario == somaDivisores($num_usuario)) {
            echo "<strong style='color: green; font-size: 1.2em;'>✔ O número $num_usuario É PERFEITO!</strong><br><br>";
        } else {
            echo "<strong style='color: red;'>❌ O número $num_usuario NÃO é perfeito.</strong><br><br>";
        }

        // 2. Busca todos os números perfeitos de 1 até o número digitado
        echo "<b>Números perfeitos encontrados entre 1 e $num_usuario:</b><br>";
        $encontrou_algum = false;
        
        for($j = 1; $j <= $num_usuario; $j++) {
            if($j == somaDivisores($j)) {
                echo "➔ $j <br>";
                $encontrou_algum = true;
            }
        }
        
        if(!$encontrou_algum) {
            echo "<i>Nenhum número perfeito encontrado nesse intervalo.</i>";
        }
        
        echo "</div>";
    }
    ?>
</div>

</body>
</html>

⚠️ Cuidado com o Processamento!

Como os números perfeitos são calculados dividindo um por um até o infinito, testar números maiores que 10.000 pode travar ou deixar o seu navegador muito lento! Por isso, no nosso formulário HTML, colocamos uma trava de segurança max="10000".

Gostou da Lógica? Aprimore-se! 💡

Exercícios como o dos Números Perfeitos são o segredo para treinar o seu cérebro de programador. Na nossa Apostila Completa de PHP, você encontra dezenas de exercícios resolvidos e comentados como esse, prontos para você estudar.

Baixar Apostila Completa de PHP

Nenhum comentário: