C#  -  Verificando se um número é primo


 Hoje veremos algumas abordagens que podemos usar para verificar se um número é primo usando a linguagem C#.

Um inteiro maior do que 1 é chamado de número primo se seus únicos divisores positivos (fatores) forem o número 1 e ele mesmo.

Por exemplo, os divisores primos de 10 são 2 e 5; e os primeiros seis números primos são 2, 3, 5, 7, 11 e 13.  O número 1 não é primo e o número 2 é o único número primo par.

Assim, se n (n > 1) é um número inteiro.

Dizemos que:

Para testar se um dado número é primo podemos usar um código bem simples como o abaixo onde usamos um laço for/next :

Console.WriteLine("### Verificando se um número é primo ###\n");

while(true)
{
        Console.WriteLine("Informe um número até 99998 (99999 sai)");
        var numero = Int32.Parse(Console.ReadLine());

       if (numero == 99999)
           break;

        if (numero < 2 || numero > 99998)
        {
            Console.WriteLine("Número menor que 2 e maior
                                     que 1000 não vale");
        }
        else
        {
            var resultado = VerificaNumeroPrimo(numero);
            Console.WriteLine("O número {0} {1} primo.\n",
                          numero, resultado ? "É" : "NÃO ");
        }
}

bool VerificaNumeroPrimo(int numero)
{
    bool ePrimo = true;
    for (int divisor = 2; divisor <= Math.Sqrt(numero); divisor++)
    {
        if (numero % divisor == 0)
        {
            ePrimo = false;
            break;
        }
    }

    return ePrimo;
}

Abaixo temos o projeto em execução :

Usando LINQ podemos otimizar o código e obter o mesmo resultado, para isso  basta criar o método VerificaNumeroPrimoLINQ(int numero) com o código a seguir:

bool VerificaNumeroPrimoLINQ(int numero)
{
    bool ePrimo = Enumerable.Range(2, (int)Math.Sqrt(numero) - 1)
                 .All(divisor => numero % divisor != 0);

    return ePrimo;
}

Usando outra abordagem

Aqui está um código alternativo e mais enxuto para verificar se um número é primo em C#:

public static bool IsPrime(int numero)
{
    if (numero <= 1)
    {
        return false;
    }

    for (int i = 2; i <= Math.Sqrt(numero); i++)
    {
        if (numero % i == 0)
        {
            return false;
        }
    }

    return true;
}

Este código é otimizado porque verifica apenas os números até a raiz quadrada do número. Isso é porque se um número for divisível por qualquer número maior que sua raiz quadrada, ele também será divisível por todos os números menores que sua raiz quadrada.

Este código também é robusto porque verifica se o número é menor ou igual a 1. Se o número for menor ou igual a 1, ele não é primo.

Você pode usar este código para verificar se qualquer número é primo. Por exemplo, para verificar se o número 13 é primo, você pode usar o seguinte código:

bool isPrime = IsPrime(13);

Implementando o Crivo de Eratóstenes

Outra abordagem é implementar o algoritmo de Crivo de Eratóstenes, que é um método eficiente para encontrar todos os números primos até um determinado valor.

using System;

class Program
{
    static void Main()
    {

        // Altere o número que deseja verificar aqui
        int numero = 37;

        if (IsPrime(numero))
            Console.WriteLine($"{numero} é primo.");
        else
            Console.WriteLine($"{numero} não é primo.");
    }

    static bool IsPrime(int numero)
    {
        if (numero<= 1)
            return false;

        if (numero<= 3)
            return true;

        if (numero% 2 == 0 || numero% 3 == 0)
            return false;

        int i = 5;
        while (i * i <= numero)
        {
            if (numnumerober % i == 0 ||
                           numero% (i + 2) == 0)
                return false;
            i += 6;
        }

        return true;
    }
}

Essa implementação é robusta e otimizada para verificar se um número é primo.

Ela evita iterações desnecessárias e é eficiente mesmo para números grandes. No entanto, é importante observar que a eficiência do algoritmo de Crivo de Eratóstenes diminui para números muito grandes, e nesses casos, podem ser necessários métodos mais avançados de teste de primalidade, como o teste de Miller-Rabin.

Pegue o projeto aqui:  CSharp_NumerosPrimos.zip

E estamos conversados.

"Ainda que eu fale as línguas dos homens e dos anjos, se não tiver amor, serei como o sino que ressoa ou como o prato que retine."
I Coríntios 13:1

Referências:


José Carlos Macoratti