Verificar se um Número é Primo em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, aprenderemos a verificar se um número é primo na programação em C. O laboratório consiste em três etapas: ler uma entrada inteira do utilizador, testar a divisibilidade de 2 até à raiz quadrada do número e imprimir se o número é primo ou não. No final deste laboratório, terá um programa funcional que pode determinar a primalidade de um inteiro dado.

O laboratório começa ensinando como ler uma entrada inteira do utilizador usando a função scanf(). Em seguida, apresenta o algoritmo de verificação de números primos, que envolve testar a divisibilidade de 2 até à raiz quadrada do número de entrada. Se nenhum divisor for encontrado, o número é considerado primo. Finalmente, o programa imprime o resultado, indicando se o número é primo ou não.

Ler um Inteiro

Nesta etapa, aprenderemos a ler uma entrada inteira do utilizador em programação C. Esta é a primeira etapa na criação de um verificador de números primos.

Primeiro, vamos criar um novo ficheiro C para o nosso programa de verificação de números primos:

cd ~/project
nano prime_checker.c

Agora, vamos escrever o código para ler um inteiro:

#include <stdio.h>

int main() {
    int number;

    printf("Introduza um inteiro positivo para verificar se é primo: ");
    scanf("%d", &number);

    printf("Introduziu: %d\n", number);

    return 0;
}

Exemplo de saída:

Introduza um inteiro positivo para verificar se é primo: 17
Introduziu: 17

Vamos decompor o código:

  • #include <stdio.h> inclui a biblioteca de entrada/saída padrão
  • int main() é a função principal onde a execução do programa começa
  • int number; declara uma variável inteira para armazenar a entrada do utilizador
  • printf() exibe um prompt para o utilizador
  • scanf() lê uma entrada inteira do utilizador e armazena-a em number
  • printf() confirma o número introduzido pelo utilizador

Compile e execute o programa:

gcc prime_checker.c -o prime_checker
./prime_checker

Testar Divisibilidade de 2 a √n

Nesta etapa, iremos implementar o algoritmo de verificação de números primos, testando a divisibilidade de 2 até à raiz quadrada do número de entrada.

Vamos modificar o nosso programa C anterior para adicionar a lógica de verificação de números primos:

nano ~/project/prime_checker.c

Atualize o código com o teste de divisibilidade:

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

int is_prime(int number) {
    // Números inferiores a 2 não são primos
    if (number < 2) {
        return 0;
    }

    // Verificar a divisibilidade de 2 até à raiz quadrada do número
    for (int i = 2; i <= sqrt(number); i++) {
        if (number % i == 0) {
            return 0; // Não é primo se for divisível
        }
    }

    return 1; // Primo se nenhum divisor for encontrado
}

int main() {
    int number;

    printf("Introduza um inteiro positivo para verificar se é primo: ");
    scanf("%d", &number);

    if (is_prime(number)) {
        printf("%d é um número primo.\n", number);
    } else {
        printf("%d não é um número primo.\n", number);
    }

    return 0;
}

Compile o programa com a biblioteca matemática:

gcc ~/project/prime_checker.c -o ~/project/prime_checker -lm

Exemplos de saídas:

Introduza um inteiro positivo para verificar se é primo: 17
17 é um número primo.

Introduza um inteiro positivo para verificar se é primo: 20
20 não é um número primo.

Pontos chave sobre a implementação:

  • A função sqrt() de <math.h> calcula a raiz quadrada
  • Só verificamos a divisibilidade até √n para otimizar o algoritmo
  • Se nenhum divisor for encontrado, o número é primo
  • O operador módulo % verifica a divisibilidade
  • Devolvemos 0 para números não primos e 1 para números primos

Imprimir se Primo ou Não

Nesta etapa final, iremos melhorar o nosso programa de verificação de números primos, adicionando saídas mais detalhadas e permitindo verificações múltiplas de números.

Vamos modificar o programa para fornecer uma saída mais abrangente:

nano ~/project/prime_checker.c

Atualize o código com uma interface melhorada:

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

int is_prime(int number) {
    // Números inferiores a 2 não são primos
    if (number < 2) {
        return 0;
    }

    // Verificar a divisibilidade de 2 até à raiz quadrada do número
    for (int i = 2; i <= sqrt(number); i++) {
        if (number % i == 0) {
            return 0; // Não é primo se for divisível
        }
    }

    return 1; // Primo se nenhum divisor for encontrado
}

void print_prime_details(int number) {
    if (is_prime(number)) {
        printf("%d é um NÚMERO PRIMO!\n", number);
        printf("Explicação:\n");
        printf("- É divisível apenas por 1 e por si próprio\n");
        printf("- Nenhum outro divisor foi encontrado entre 2 e √%d\n", number);
    } else {
        printf("%d NÃO é um número primo.\n", number);

        // Encontrar e imprimir o menor divisor
        for (int i = 2; i <= sqrt(number); i++) {
            if (number % i == 0) {
                printf("Explicação:\n");
                printf("- Divisível por %d\n", i);
                printf("- %d × %d = %d\n", i, number / i, number);
                break;
            }
        }
    }
}

int main() {
    int number, continue_check;

    do {
        printf("Introduza um inteiro positivo para verificar se é primo: ");
        scanf("%d", &number);

        print_prime_details(number);

        printf("\nDeseja verificar outro número? (1=Sim, 0=Não): ");
        scanf("%d", &continue_check);
    } while (continue_check == 1);

    printf("Obrigado por utilizar o Verificador de Números Primos!\n");

    return 0;
}

Compile o programa:

gcc ~/project/prime_checker.c -o ~/project/prime_checker -lm

Exemplos de saídas:

Introduza um inteiro positivo para verificar se é primo: 17
17 é um NÚMERO PRIMO!
Explicação:
- É divisível apenas por 1 e por si próprio
- Nenhum outro divisor foi encontrado entre 2 e √17

Deseja verificar outro número? (1=Sim, 0=Não): 1

Introduza um inteiro positivo para verificar se é primo: 20
20 NÃO é um número primo.
Explicação:
- Divisível por 2
- 2 × 10 = 20

Deseja verificar outro número? (1=Sim, 0=Não): 0
Obrigado por utilizar o Verificador de Números Primos!

Melhorias chave:

  • Adicionadas explicações detalhadas para números primos e não primos
  • Implementado um ciclo para permitir verificações múltiplas de números
  • Fornece uma saída mais educativa sobre as propriedades dos números

Resumo

Neste laboratório, aprendemos como ler um inteiro inserido pelo utilizador em programação C, que é o primeiro passo na criação de um verificador de números primos. Em seguida, implementamos o algoritmo de verificação de números primos testando a divisibilidade de 2 até à raiz quadrada do número de entrada. O programa verifica se um número dado é primo, iterando pelos números de 2 até à raiz quadrada do número e verificando se algum deles divide o número uniformemente. Se nenhum divisor for encontrado, o número é considerado primo.