Exercícios de C/C++ para iniciantes

Verificar número primo em C e C++

Nesta lição, você vai verificar se um inteiro é primo testando divisores até a sua raiz quadrada.

Introdução

Um número primo é maior que 1 e só é divisível por 1 e por ele mesmo. Para testar, dividimos o número pelos valores menores que ele. Mas basta testar até a raiz quadrada do número, o que deixa o programa muito mais rápido.

Pontos importantes

  • Ative os avisos do compilador (compiler warnings) e corrija todos eles.
  • Entenda o tipo de dado e o tempo de vida (lifetime) de cada valor.
  • Sempre valide os dados de entrada e os limites dos índices de arrays.

Exemplos de código C e C++

C
Executar →
main.c
#include <stdio.h>
int main(void) {
    int number = 29, prime = number > 1;
    // A composite number has a factor no larger than its square root.
    for (int divisor = 2; divisor * divisor <= number; ++divisor)
        if (number % divisor == 0) { prime = 0; break; }
    printf("%d is %sprime\n", number, prime ? "" : "not ");
}
Resultado da execução
29 is prime
C++
Executar →
main.cpp
#include <iostream>
int main() {
    int number = 29;
    bool prime = number > 1;
    // Stop after the square root and on the first divisor.
    for (int divisor = 2; divisor * divisor <= number && prime; ++divisor)
        prime = number % divisor != 0;
    std::cout << number << " is " << (prime ? "" : "not ") << "prime\n";
}
Resultado da execução
29 is prime

Comparação entre C e C++

O laço só continua enquanto divisor * divisor <= number, porque, se o número tiver um divisor maior que a raiz quadrada, ele vem acompanhado de um divisor menor que já foi testado. Assim que encontra um divisor, a versão em C sai do laço com break, e a versão em C++ para graças à condição && prime. O resultado mostra que 29 é primo.

C

C usa funções procedurais pequenas e deixa à vista como os dados ficam na memória.

C++

C++ continua permitindo trabalhar em baixo nível, mas acrescenta tipos da biblioteca e abstrações mais seguras.

Exercícios práticos

Execute as duas versões e depois mude o código para observar a diferença de segurança que cada linguagem oferece.

  • Teste entradas inválidas e valores nos limites.
  • Compile com as flags -Wall -Wextra -Wpedantic para ativar mais avisos.
  • Separe as declarações compartilhadas em um arquivo de cabeçalho e a implementação em outro arquivo.

Pratique com um desafio

Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.

Todos os desafios