1221 - Primo Rápido

Uma maneira criativa de combinar duas formas de verificar a primalidade de um número.

Descrição

Solução

Confira a página Números primos para entender como calcular a primalidade de números até 2^31, que por ser um valor consideravelmente alto, não é possível criar um vetor com tantas posições. Por isso, vamos fazer o crivo até um valor um pouco maior do que a raiz quadrada de 2^31 (aqui escolhemos 2^16) e depois testar do jeito convencional.

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int Crivo(int *C, int *primos, int n)
{
    int p = 0;

    for (int i = 0; i < n; ++i)
    {
        C[i] = 1;
    }
    C[1] = 0;
    primos[p++] = 2;

    for (int i = 4; i < n; i += 2)
    {
        C[i] = 0;
    }

    for (int i = 3; i < n; i += 2)
    {
        if (C[i] == 1)
        {
            primos[p++] = i;

            for (int j = i * 3; j < n; j += 2 * i)
            {
                C[j] = 0;
            }
        }
    }

    return p;
}

int ehPrimo(int *primos, int p, int n)
{
    int limite = sqrt(n) + 1;

    for (int i = 0; i < p && primos[i] < limite; ++i)
    {
        if (n % primos[i] == 0)
        {
            if (n == primos[i])
                return 1;
            return 0;
        }
    }

    return 1;
}

int main()
{
    int N, X, numeroPrimos, C[65536], primos[65536];

    numeroPrimos = Crivo(C, primos, 65536);

    scanf("%d", &N);

    for (int i = 0; i < N; ++i)
    {
        scanf("%d", &X);

        printf("%s\n", ehPrimo(primos, numeroPrimos, X) ? "Prime" : "Not Prime");
    }

    return 0;
}

Last updated